onpostexecute لم يتم استدعاؤه بعد الانتهاء من Asynctask
-
25-09-2019 - |
سؤال
لسبب ما بلدي onPostExecute()
لا يسمى بعد بلدي AsyncTask
ينتهي.
تفكك صفي:
public class setWallpaperForeground extends AsyncTask<String, Integer, Boolean>
بلدي onpostexecute ():
protected void onPostExecute(Boolean result)
كل شيء يعمل بشكل جيد يا doInBackground()
يكمل بنجاح ويعيد منطقية ولكن بعد ذلك ينتهي فقط.
شكرًا
المحلول
هل قمت بإنشاء asynctask الخاص بك على موضوع واجهة المستخدم؟ قم أيضًا بإضافة ounotaiton Override على طريقة OnPostExecute () للتأكد من إعلانها بشكل صحيح.
نصائح أخرى
هل بدأت المهمة مع execute()
طريقة؟ ال onPostExecute
لن يتم تشغيل إذا كنت تستدعي فقط doInBackground
.
وجدت/ارتكبت خطأً سيئًا آخر:
إذا كان الخاص بك onPostExecute(Param param)
لا تتطابق مع الشخص الذي حددته extends AsyncTask<...,...,Param>
وأنت لم تستخدم @Override
التعليقات التوضيحية ، لن يتم تنفيذها أبدًا ولا تحصل على تحذير من Eclipse.
لاحظ لنفسي: فقط استخدم دائمًا @Override
سوف يساعدك التعليق التوضيحي والكسوف.
طريقة أخرى سهلة لتجنب جميع الأخطاء المسمى:
في الكسوف: Right-click in code > Source > Override/Implement Methods
بعد أن أواجه نفس المشكلة ولم يساعدني أي من هذه الإجابات ، اكتشفت أن موضوع واجهة المستخدم قد تم حظره (استخدمت أ CountDownLatch.await()
) وبالتالي ال onPostExecute()
الطريقة التي من المفترض أن يطلق عليها مؤشر ترابط واجهة المستخدم لم يطلق عليها أبدًا.
ارتكبت خطأً سيئًا آخر يمكن أن يؤدي إلى هذا الخطأ نفسه. عند تعريف Asynctask ودعوها ، لم أكن أتصل execute
ولكن كان يدعو doInBackground
new AsyncTask<String,Void,Void>() {
....
}.doInBackground("parameter");
عوضا عن
new AsyncTask<String,Void,Void>() {
....
}.execute("parameter");
لقد واجهت نفس المشكلة. لم يعمل أي من الحلول المذكورة أعلاه بالنسبة لي. ثم اكتشفت المشكلة ربما تساعد شخصًا آخر.
في سلسلة واجهة المستخدم ، أسمي الرموز التالية:
public class XActivity ...{
onCreate(){
....
new SaveDrawingAsync(this).execute();
while(true)
{
if(MandalaActivity.saveOperationInProgress){
continue;
}
super.onBackPressed();
break;
}
...
}
}
تعريف فئة Asynctask الخاص بي:
public class SaveAsync extends AsyncTask<Object, Void, Void> {
@Override
public Void doInBackground(Object... params) {
saveThem(); // long running operation
return null;
}
@Override
public void onPostExecute(Void param) {
XActivity.saveOperationInProgress = false;
}
@Override
public void onPreExecute() {
XActivity.saveOperationInProgress = true;
}
}
في الكود أعلاه لا يسمى onpostexecute. إنه بسبب حلقة لا حصر لها بعد تنفيذ Asynctask. Asynctask و inifinite حلقة كلاهما ينتظران بعضهما البعض. وبالتالي فإن الكود فو!
الحل هو تغيير التصميم!
كان لدي نفس السلوك ، والسبب هو أنني قمت بنشر الكثير من الرسائل كتقدم داخل Doinbackground مع التعليمات البرمجية التالية:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// .. some UI updates
}
});
يجب أن يكون لهذا قائمة انتظار رسائل Thrad الرئيسية المحملة ، وتسبب في تأخير طويل قبل أن يتم استدعاء onpostexecute. كان الحل هو النشر مرة واحدة فقط كل ثانية.
بالنسبة لي كان خطأ المستخدم. كنت أنهي Asynctask من خلال استدعاء الإلغاء (صحيح) عليه وعدم قراءة الوثائق بشكل وثيق بما يكفي لمعرفة أن onpostexecute لا يسمى في هذه الحالة ، oncancelled هو.