كيفية استخدام أسينكتاسك بشكل صحيح خلال سينكادابتر أونبيرفورمسينك
-
29-10-2019 - |
سؤال
لقد تلقيت عددا كبيرا من تقارير الأخطاء من المستخدمين الذين تم الإبلاغ عنهم من مربعات حوار إغلاق القوة التي تذكر شيئا مثل ما يلي:
java.lang.ExceptionInInitializerError
at com.MyRequest.execute(MyRequest.java:59)
at org.nsdev.MySyncAdapter.onPerformSync(MySyncAdapter.java:90)
at android.content.AbstractThreadedSyncAdapter$SyncThread.run(AbstractThreadedSyncAdapter.java:164)
Caused by: java.lang.RuntimeException:
Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:121)
at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
at android.os.AsyncTask.<clinit>(AsyncTask.java:152)
الآن ، كنت أحاول معرفة أفضل طريقة لحل هذه المشكلة.داخل تنفيذ أونبيرفورمسينك بلدي أنا خلق عدد من أسينكتاسكس وتنفيذها.أظن أن مشكلتي هي أنني لا أنتظر إكمال هذه المهام قبل العودة من أونبيرفورمسينك.حاولت أن أفعل ما يلي:
Looper.prepare();
// Execute async tasks
Looper.loop();
ثم أقوم بإعداد عداد وعندما ينخفض هذا العداد إلى الصفر ، اتصل بوبر.ميلوبر ().إنهاء () داخل رد الاتصال من المهام غير المتزامنة.
ولكن القيام بذلك يؤدي إلى تعطل طلبي بشكل أكثر صعوبة مع خطأ وقت التشغيل التالي:
java.lang.RuntimeException: Main thread not allowed to quit
at android.os.MessageQueue.enqueueMessage(MessageQueue.java:175)
at android.os.Looper.quit(Looper.java:173)
at org.nsdev.MySyncAdapter$1.requestFinished(MySyncAdapter.java:89)
at com.MyAsyncTask.onPostExecute(MyAsyncTask.java:84)
at android.os.AsyncTask.finish(AsyncTask.java:417)
at android.os.AsyncTask.access$300(AsyncTask.java:127)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)
أي فكرة عن كيفية إنجاز المزامنة بشكل صحيح?
المحلول
أعلم أن هذا المنشور قديم ، ولكن بالنسبة للآخرين الذين يصادفون هذا الموضوع ، فماذا عن عدم استدعاء looper.quit () في الموضوع الرئيسي؟يعمل ما يلي بالنسبة لي من خدمة SyncAdpater التي تولد العديد من AsyncTasks ، على الرغم من أنه قد تكون هناك أسباب أخرى لعدم القيام بذلك من حيث الأداء ... Genacodicetagpre
نصائح أخرى
في الواقع لا يمكنك ذلك.يستخدم AsyncTask مؤشر ترابط UI الرئيسي ويعتمد على Handler و Looper وهو غير متوفر هناك.استخدم تنفيذ سلسلة الرسائل الخالصة ، ويجب استخدام AsyncTask فقط في الأنشطة.
استجابة أبلوك حل المشكلة ، ولكن المشكلة مع هذا الحل هو أن واجهة المستخدم يتجمد ، هذه المشكلة موجودة في الروبوت 2.2 والروبوت 2.3.كانت خدعة وجدت لاستدعاء منشئ أسينكتاسك في صفي SyncAdapter
وتستخدم Looper.prepare()
:
/**
* Constructor. Obtains handle to content resolver for later use.
*/
public SyncAdapter(Context context, boolean autoInitialize) {
super(context, autoInitialize);
mHandler = new Handler();
//Crear un dummy AsyncTask
new AsyncTask<Void, Void,String>() {
@Override
protected String doInBackground(Void... params) {
return null;
}
}.execute(null,null);
}