العد التنازلي: "لا يمكن إنشاء معالج داخل مؤشر ترابط لم يسمى looper.prepare ()"

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

سؤال

أعلم أن المشكلة العامة المتمثلة في "لا يمكن إنشاء معالج داخل الخيط الذي لم يطلق عليه Looper.Prepare ()" قد تم طلبه من قبل ، لكنني أواجه أن أفهم كيف ينطبق ذلك في هذه الحالة.

أحاول بناء عددوم جديد في مؤشر ترابط غير UI ، والذي أعتقد أنه سبب هذا الخطأ ، لكنني لا أفهم حقًا سبب حاجة الموقت إلى استخدام الخيط الرئيسي. من ما يمكنني رؤيته ، يبدو أنه يحتوي على معالج رد اتصال يحتاج إلى تشغيل في مؤشر ترابط يحتوي على looper ، والذي لا يحتوي عليه مؤشر الترابط غير UI بشكل افتراضي. يبدو أن خياراتي هي: 1) اجعل هذا الخيط غير الخاص بـ UI يحتوي على looper أو 2) قم بعمل بعض الطرق الغريبة على موضوع واجهة المستخدم الذي يمكنه إنشاء هذا المؤقت ، وكلاهما يبدو لي. هل يمكن لأي شخص مساعدتي في فهم الآثار؟

أيضًا ، هل يعرف أي شخص أي روابط مفيدة تلقِ الضوء على Looper و Messagequeue؟ أنا لا أفهمهم جيدًا ، كما أنا متأكد من أنني أظهرت. شكرًا لك!

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

المحلول

لا يحتاج المؤقت إلى أن يكون في موضوع واجهة المستخدم. لكن أعتقد أنك تقوم بتحديث واجهة المستخدم لعرض عدد العد التنازلي في هذا الموضوع. يو لا يمكنك فعل ذلك.

استخدم asynctask وقم بتحديث واجهة المستخدم في onProgressUpdate

نصائح أخرى

يجب إنشاء مثيل للعد التنازلي على موضوع واجهة المستخدم.

إذا كان لديك كائن الفئة المخصصة:

public class MyTimer extends CountDownTimer{
    public MyTimer(...){
         super(duration,interval);
    }
    //... other code ...//
}

يجب تشغيل بناء الكائن على موضوع واجهة المستخدم

MyTimer mTimer = new MyTimer(...);   //can throw RuntimeException
                                    // with Looper.prepare() issue if
                                    // caller isn't UI thread

إذا كانت خيوط متعددة تقوم بإنشاء وتدمير المؤقت ، فتأكد من إنشاؤه على مؤشر ترابط واجهة المستخدم عن طريق القيام بشيء مثل هذا:

MyActivity.runOnUiThread( new Runnable(){
     public void run(){
          mTimer = new MyTimer(...);
     }
});

لكن لاحظ كيف يحتاج قطاع الرمز أعلاه إلى إشارة إلى نشاطك وإلى متغير عضو في الفصل

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