سؤال

أقوم بإنشاء تطبيق بحث الحدث ، قمنا بتعيين معايير البحث من شاشة واحدة ممتلئة في شاشة أخرى ، ثم يمكن للمستخدم تحرير معايير البحث من الشاشة الثالثة والانتقال إلى الشاشة الرابعة.

لتحقيق المهمة أعلاه ، أستخدم كائنًا ثابتًا يتذكر القيم المحيطة بالتطبيق ولا أحتاج إلى القيام بأي شيء إضافي.

لكنني أخاف إذا كانت دورة حياة الكائن الثابتة في Android إذا وجدت الذاكرة المنخفضة أندرويد حذف كائنات ثابتة ؟؟؟

نظرًا لأن Android يدعم المهام المتعددة ، إذا تحول المستخدم إلى تطبيق آخر ، وعندما يعود المستخدم ، ابدأ في العمل بالجنون ، فهل تتم إزالة الكائن الثابت عندما يكون مهمة متعددة ؟؟؟ اي فكرة ؟؟ وأيضًا تقترح عقد كائن ثابت عبر طريقة Singleton هو النهج الأفضل ؟؟؟

هل كانت مفيدة؟

المحلول

لنبدأ بقليل من الخلفية: ماذا يحدث عند بدء تطبيق؟
يبدأ نظام التشغيل العملية ويقوم بتعيين معرف عملية فريد ويخصص جدول عملية. عملية تبدأ مثيل DVM (Dalvik VM) ؛ يعمل كل تطبيق داخل DVM.
يدير DVM تحميل الفئة التفريغ ، دورة حياة المثيل ، GC إلخ.

عمر متغير ثابت: يأتي متغير ثابت في الوجود عندما يتم تحميل فئة بواسطة JVM ويموت عند تفريغ الفصل.

لذلك إذا قمت بإنشاء تطبيق Android وتهيئة متغير ثابت ، فسيبقى في JVM حتى يحدث أحد ما يلي:
1. تم تفريغ الفصل
2. يغلق JVM
3. تموت العملية

لاحظ أن قيمة المتغير الثابت ستستمر عند التبديل إلى نشاط مختلف لتطبيق آخر ولا يحدث أي من الثلاثة أعلاه. إذا حدث أي مما ذكر أعلاه ، فإن الثابت سيخسر قيمته.

يمكنك اختبار هذا مع بضعة أسطر من التعليمات البرمجية:

  1. اطبع الثابت غير المسموح به في oncreate من نشاطك -> يجب طباعة فارغة
  2. تهيئة الثابت. طباعته -> ستكون القيمة غير فارغة
  3. اضغط على زر العودة وانتقل إلى الشاشة الرئيسية. ملاحظة: الشاشة الرئيسية هي نشاط آخر.
  4. قم بتشغيل نشاطك مرة أخرى -> سيكون المتغير الثابت غير خارق
  5. اقتل عملية التقديم الخاصة بك من DDMS (زر إيقاف في نافذة الأجهزة).
  6. أعد تشغيل نشاطك -> سيكون الثابت قيمة فارغة.

امل ان يساعد.

نصائح أخرى

حسنًا ، يعتمد نمط Singleton أيضًا على استخدام متغيرات ثابتة ، لذا فأنت في الواقع ستكون في نفس الموقف. على الرغم من أن النهج الثابت قد يعمل في معظم الأوقات ، فقد يحدث أنه في بعض الحالات عندما تكون الذاكرة ممتلئة ونشاط آخر يأخذ المقدمة قبل أن ينتقل تطبيقك إلى شاشته التالية ، يمكن قتل عملية نشاطك وتفقد القيم الثابتة. ومع ذلك ، يقدم Android بعض الخيارات للقيم المستمرة بين الحالات أو نقلها مثل:

  • باستخدام نية ، يمكنك تمرير معايير البحث الخاصة بك من نشاط إلى آخر (على غرار طلب HTTP على الويب)
  • باستخدام تفضيلات التطبيق ، يمكنك حفظ القيم واستردادها في النشاط الذي يحتاجها
  • باستخدام قاعدة بيانات SQLite ، يمكنك استمرارها في جدول واستردادها لاحقًا
  • إذا كنت بحاجة إلى حفظ حالة النشاط فقط بحيث يتم ملء الحقول عند إعادة التشغيل بقيمها المحددة مسبقًا ، فيمكنك تنفيذ طريقة النشاط onsaveinstancestate () - لاحظ أن هذا غير مستحسن لاستمرار الأنشطة في الحالات.

يمكنك الحصول على بعض أمثلة التعليمات البرمجية لاستخدام التفضيلات والنوايا وقاعدة بيانات SQLite من خلال النظر في شجرة رمز المصدر Aegis-Shield في رمز Google أو في تطبيقات Android مفتوحة المصدر الأخرى.

بعد بعض الأبحاث ، اتضح أن استخدام التطبيق لتخزين Singletons ليس رائعًا في فكرة ، إلا إذا كنت مستعدًا لإعادة إنشائها:

لا تقم بتخزين البيانات في كائن التطبيق

وذلك في حين الجواب المقبول من الناحية الفنية ، لا يوفر جميع المعلومات.

كما يوحي الرابط أعلاه ، إذا كنت ترغب حقًا في الالتزام بهذا النموذج ، فيجب أن تكون مستعدًا للتحقق من NULL وإعادة إنشاء البيانات ، إن أمكن.

@R1K0 هنا. لن يستمر تخزين البيانات في الحقول الثابتة للفئة ما بمفردها عبر عمليات القتل وإعادة التشغيل. يقتل Android بشكل روتيني العمليات (تشغيل التطبيقات) عندما يحتاج إلى الذاكرة.

لكل مستند Android: حالة النشاط والطرد من الذاكرة,

النظام لا يقتل أي نشاط مباشرة. بدلاً من ذلك ، فإنه يقتل العملية التي يعمل فيها النشاط ، مما يدمر ليس فقط النشاط ولكن كل شيء آخر يعمل في هذه العملية أيضًا.

يمكنك حفظ واستعادة حالة البدائل وكذلك الكائنات القابلة للتسلسل والقابلة للطرد باستخدام الأساليب أدناه. تسمى هذه تلقائيا خلال دورة حياة النشاط العادي.

protected void onSaveInstanceState(Bundle state) {}
protected void onRestoreInstanceState(Bundle savedInstanceState){}

لذلك ، إذا كان لديك فئة تحتوي على متغيرات ثابتة فقط ، فيمكنك حفظ حالة كل حقل في onsaveinstancestate () واستعادتها في onrestoreinstancestate (). عندما يقتل Android العملية التي يعمل بها تطبيقك ، سيتم حفظ حالة المتغيرات الخاصة بك ، وعندما يعيد Android تطبيقك ، سيتم استعادة القيم في الذاكرة في نفس الحالة كما كان من قبل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top