سؤال

لسبب ما بلدي 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 هو.

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