如何管理Loopers和Threads(线程不再死了!)

e-c*_*cal 9 multithreading android handler looper

我创建了一个扩展Thread的类,通过LocationManager在非ui线程中检索用户位置.我将它作为一个线程实现,因为它必须在请求时启动并在有限的时间内完成它的工作.顺便说一句,我必须在线程中添加一个Looper对象,以便能够为LocationManager(onLocationChanged)创建处理程序.

这是代码:

public class UserLocationThread extends Thread implements LocationListener {
//...
public void run() {
    try {
        Looper.prepare();
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
        Looper.loop();
        Looper.myLooper().quit();
    } catch (Exception e) {
        //...
    }
}

@Override
public void onLocationChanged(Location location) {
    locationManager.removeUpdates(this);
    //...
    handler.sendMessage(msg); //this is the handler for communication with father thread
}

//...}
Run Code Online (Sandbox Code Playgroud)

我希望线程启动,接收用户位置数据(在这种情况下只是一次),通过消息将数据发送到主线程给处理程序,然后死掉.问题是,在我的情况下,一旦run方法结束,线程就不会再死了(应该没问题,因为否则onLocationChanged将不会收到新的位置).

但是通过这种方式,假设线程的停止和挂起方法已被弃用,那么至少在这种情况下,使用looper die创建一个线程会是一个好方法吗?

提前致谢 ;)

ina*_*ruk 20

您可以使用以下命令显式退出Looper循环Handler:

private Handler mUserLocationHandler = null;
private Handler handler = null;

public class UserLocationThread extends Thread implements LocationListener {    

 public void run() {
    try {
          Looper.prepare();
        mUserLocationHandler = new Handler();
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
        Looper.loop();

    } catch (Exception e) {
        //...
    }
}


@Override
public void onLocationChanged(Location location) {
    locationManager.removeUpdates(this);
    //...
    handler.sendMessage(msg); 
    if(mUserLocationHandler != null){
        mUserLocationHandler.getLooper().quit();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 当你调用`Looper.myLooper()`时,你会得到与当前线程相关联的`Looper`.当你调用`handler.getLooper()`时,你会得到与特定`handler`相关联的`Looper`. (3认同)
  • 哦,我明白你的意思了:)不,在你的原始代码中,在调用`Looper.mylooper().loop()`之后调用`Looper.myLooper().quit()`.除非你调用`quit()`,否则`loop()`函数不会返回.你在**`loop()之后调用`quit()`**.所以基本上,你永远不会达到你的`quit()`并最终进入无限的`loop()`:) (2认同)