0

我有以下问题。我用 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()返回 null 而不是 Looper。

我不知道为什么它是空的。我试图打电话给locationThread.isAlive()返回true。我也试图得到locationThread.handler;我知道不为空的。我也做了很多谷歌搜索,但我没有找到比文档更多的东西。

非常感谢您的回答。

4

2 回答 2

2

您的代码null很可能正在读取,因为这两个操作彼此不同步。您无法成功调用getLooper()直到Handler完成Looper.prepare()并构造处理程序。因为Thread.start()在其他线程执行时不会阻塞(当然,为什么会这样?那会破坏新线程的目的),您在run()线程块和尝试设置位置侦听器的代码之间创建了竞争条件。这将根据谁可以先执行在不同的设备上产生不同的结果。

此外,注册位置更新已经是一个异步过程,所以有人想知道为什么需要辅助线程?您可以简单地向您的侦听器请求更新,而无需传入辅助Looper线程,当有新更新可用时,侦听器将获取发布的数据,在此过程中主线程不会保持阻塞。

于 2012-07-27T22:13:58.357 回答
0

你必须在你的构造函数中调用 super() 吗?也许 Looper 没有被设置,因为父构造函数没有被调用?

好的,试试这个。做这个:

public class GeoLocationThread extends Thread{

是这样的:

public class GeoLocationThread extends HandlerThread{

那么你可以在构造 Handler 或需要 looper 时执行 this.getLooper() 。

于 2012-07-27T20:37:28.853 回答