هل أحتاج إلى نسخ كائنات ثابتة إذا أردت الوصول إليها من Asynctask؟
-
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 تحديث الكائن في نفس الوقت. هذه الحالة ستؤدي إلى إبطاء عمليات ذلك المتزامنة لأنها تعتمد جميعها على النية الدقيقة. أعتقد أنك تستخدم كائنًا ثابتًا لسبب ما ، فقد ترغب في التفكير في ذلك بطريقة أخرى إن أمكن.