هل أحتاج إلى نسخ كائنات ثابتة إذا أردت الوصول إليها من Asynctask؟

StackOverflow https://stackoverflow.com/questions/4079556

  •  28-09-2019
  •  | 
  •  

سؤال

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

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

معالجتي الحالية هي:

onStart() {// somewhere in the UI thread  
new MyTask(Constants.theObject).execute(); // (1)  
}  
// ...  
class MyTask extends AsyncTask<...> {  
MyObjectType object;  
MyTask(MyObjectType theObjectInstance) {  
object = theObjectInstance; // (2)  
// ...  
doInBackground() { // (3)  
//  ...  
} 

في (1), Constants.theObject هو كائن ثابت تم إنشاؤه عند بدء تشغيل التطبيق

في (2), ، أحصل على إشارة إلى الكائن الثابت الحالي Constants.theObject

في (3), ، لم نعد في موضوع واجهة المستخدم ، وأريد الوصول Constants.theObject (والتي قد يتم استخدامها أيضًا في الخيط الرئيسي)

.

أعتقد أن هناك ثلاث حالات محتملة.

  • هذا الرمز قبيح ، يجب أن أفعل خلاف ذلك
  • هذا الرمز على ما يرام ، فإن ملاحظات المستخدم لا تتعلق بهذا
  • هذا الرمز على ما يرام ، لكن يجب أن أقوم بعمل نسخة من Constants.theObject إذا أردت استخدامه في doInBackground; ؛ وإلا يمكن أن تفشل

آمل أن تتمكن من مساعدتي! شكرا لقراءتك.

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

المحلول

مما كتبته ، لا أعتقد أنك بحاجة إلى إنشاء نسخة ، إلا إذا MyObjectType ليس آمنًا لخيط الخيط ، وفي هذه الحالة ، تحتاج إلى التأكد من أن سلسلة رسائل واحدة فقط في كل مرة تقوم بتعديلها/لا تآكلها. (إن صنع نسخة من شأنه أن يحل هذا بالفعل ، ولكن إذا تمكنت من صنع نسخة ، فهو عالم عالمي حقًا ما يجب أن تستخدمه على أي حال؟)

هل أنت متأكد 100 ٪ من أن 1 و 3 لا يمكن أن يحدث إلا بعد تهيئة الكائن؟

نصائح أخرى

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

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