سؤال

لدي المشكلة التالية.لدي هذا التنفيذ لموضوعي مع Looper.

public class GeoLocationThread extends Thread{

public Handler handler;
private General general;


public void run(){
    Looper.prepare();       
    handler = new IncomingHandler(general);
    Looper.loop();          

}

public GeoLocationThread(General general){
    this.general=general;
}



private static class IncomingHandler extends Handler{
    private final WeakReference<General> mService; 

    IncomingHandler(General service) {
        mService = new WeakReference<General>(service);
    }

    @Override
    public void handleMessage(Message msg)
    {
         General service = mService.get();
         if (service != null) {
             Location location=service.getLl().getLocation();
                if(location.getAccuracy()<40){                                                                                      
                    service.setOrigin(new GeoPoint((int) (location.getLatitude() * 1E6),(int) (location.getLongitude() * 1E6)));
                }
         }
    }

}

}

وأود أن أفعل ما يلي:

GeoLocationThread locationThread=new GeoLocationThread(this);
locationThread.start();
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, ll, locationThread.handler.getLooper());

حيث lm هو LocationManager.من السجل والاختبار الخاص بي أستطيع أن أقول ذلك locationThread.handler.getLooper() ترجع فارغة بدلاً من Looper.

لا أعرف لماذا هو فارغ.لقد حاولت الاتصال locationThread.isAlive() والذي عاد صحيحا.لقد حاولت أيضا الحصول على locationThread.handler; الذي أعرفه ليس فارغًا.لقد قمت أيضًا بالكثير من البحث على Google، لكنني لم أجد أكثر من الوثائق.

شكرا جزيلا لكم مقدما على إجاباتكم.

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

المحلول

الكود الخاص بك قيد القراءة null على الأرجح لأن العمليتين غير متزامنتين مع بعضهما البعض.لا يمكنك الاتصال بنجاح getLooper() على Handler حتى Looper.prepare() تم الانتهاء وتم إنشاء المعالج.لأن Thread.start() لا يتم حظره أثناء تنفيذ الخيط الآخر (بالطبع، لماذا يتم ذلك؟من شأنه أن يحبط غرض الموضوع الجديد) لقد قمت بإنشاء حالة سباق بين run() كتلة الخيط والرمز الذي يحاول إعداد مستمع الموقع.سيؤدي هذا إلى نتائج مختلفة على أجهزة مختلفة بناءً على من يمكنه التنفيذ أولاً.

علاوة على ذلك، فإن تسجيل تحديثات الموقع هو بالفعل عملية غير متزامنة، لذلك يتساءل المرء لماذا هناك حاجة إلى الخيط الثانوي؟يمكنك ببساطة طلب تحديثات للمستمع الخاص بك دون تمرير أي شيء ثانوي Looper وسيحصل المستمع على البيانات المنشورة عند توفر تحديثات جديدة، ولا يبقى الخيط الرئيسي محظورًا أثناء هذه العملية.

نصائح أخرى

هل يجب عليك الاتصال بـ super() في المنشئ الخاص بك؟ربما لم يتم ضبط Looper لأنه لم يتم استدعاء المُنشئ الأصلي؟

حسنًا، جرب هذا.اصنع هذا:

public class GeoLocationThread extends Thread{

كن هذا:

public class GeoLocationThread extends HandlerThread{

ثم يمكنك القيام بهذا.getLooper() عندما تقوم بإنشاء المعالج أو عندما تحتاج إلى التكرار.

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