我创建了一个扩展 Thread 的类,以通过非 ui 线程中的 LocationManager 检索用户位置。我将其实现为一个线程,因为它必须根据请求启动并仅在有限的时间内完成其工作。
顺便说一句,我必须在线程中添加一个 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 方法结束,线程就不再终止(这应该没问题,因为否则 onLocationChanged 将不会收到新位置)。
但是这样,假设线程的 stop 和 suspend 方法已被弃用,那么至少在这种情况下,使带有循环器的线程死亡的好方法是什么?
提前致谢 ;)
您可以明确退出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();
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)