سؤال

أنا أستخدم AsyncTask فئة فرعية لبعض معالجة الخلفية.المشكلة هي أنه عندما أستخدم الفصل مع ملف .get() الطريقة، ProgressDialog أحدد في onPreExecute() لا تظهر.

أعمل بشكل جيد إذا استخدمت رد اتصال داخل ملف onPostExecute() طريقة.

فكرتي الأولى كانت أن هذا كان بسبب .get() ينتظر حتى تكتمل العملية ولكن لا يمكن أن يؤدي ذلك إلى حظر مؤشر ترابط واجهة المستخدم أيضًا، لذا فهذا ليس هو الحال.

هل يمكن لأي شخص أن يشرح سبب هذا السلوك وما إذا كان هناك حل بديل لذلك ؟؟أود حقًا استخدام .get() الطريقة إذا أستطيع.

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

المحلول

لقد قبلت في البداية الإجابة الأخرى ولكن يبدو أنها خاطئة.

ال .get() ستحظر الطريقة مؤشر ترابط واجهة المستخدم لانتظار النتيجة وسيتم أيضًا حظر أي مربعات حوار معروضة.هذا هو السلوك المتوقع لهذا الأسلوب.

البديل الوحيد هو عدم الاستخدام .get() إذا كان نشاط الخلفية لفترة زمنية ملحوظة، استخدم بدلاً من ذلك طرق رد الاتصال لنشاط الاتصال.

نصائح أخرى

الاتصال AysncTask.get() على مؤشر ترابط واجهة المستخدم سوف يمنع تنفيذ مؤشر ترابط واجهة المستخدم ويجعل مؤشر ترابط واجهة المستخدم في انتظار انتهاء AysncTask.doInBackground().من خلال القيام بذلك، أنت في الواقع تضحي بمزايا AsycnTask، حيث يتم الآن تنفيذ جميع التعليمات البرمجية بشكل متزامن في مؤشر ترابط واجهة المستخدم ومؤشر ترابط الخلفية (لا يزال هناك خيطان، ولكن مؤشر ترابط واجهة المستخدم ينتظر الآن مؤشر ترابط الخلفية).

ضع في اعتبارك أيضًا أنه من المحتمل أن تحصل على استثناء ANR (تم حظره لأكثر من 5 ثوانٍ) عن طريق استدعاء get() على مؤشر ترابط واجهة المستخدم.

إذا كان عليك استخدامه حقًا، فاتصل بالطريقة showDialog() قبل myAsyncTask.get():

showDialog();
myAsyncTask.execute();
myAsyncTask.get(); // <-- UI thread blocked and wait at this point.
dismissDialog();// <-- This line will be executed after doInBackground() finish.

أتمنى أن يساعدك هذا.

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