سؤال

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

getString(R.string.example_string); // Doesn't work

هل يجب أن أجعل هذا الفصل في خدمة وأحصل على النشاط الرئيسي توقف الفصل عند إغلاقه؟ هل يجب أن أقوم بتمرير السياق من النشاط إلى هذا الفئة مثل هذا؟

MyClass c = new MyClass(this);

أم أن هناك طريقة أفضل للتعامل مع هذه المشكلة؟

تظهر هذه المشكلة أيضًا عندما أحاول إرسال نخب من هذا الفصل.

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

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

المحلول

إذا كان لديك إجراء خلفية يتم فصل دورة حياته عن نشاطك ، فسأستخدم أ Service. في هذه الحالة ، Service سوف يكون لها Context, ، لذلك لن تحتاج إلى تمريره. إذا كنت بحاجة إلى إجراء إجراء خلفية استجابةً لحدث واجهة المستخدم (ونشر النتائج مرة أخرى في مؤشر ترابط واجهة المستخدم) ، فإنني أوصيك باستخدام ملف AsyncTask.

نصائح أخرى

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

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

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