كيفية استخدام أسينكتاسك بشكل صحيح خلال سينكادابتر أونبيرفورمسينك

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

  •  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);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top