我在这个方法中有一个名为checkUpdate
的线程:
public void onLocationChanged(Location location)
checkUpdate = new Thread() {
public void run() {
try {
// do some long staff using location variable
} catch (Exception e) {}
handler.sendEmptyMessage(0);
}
};
checkUpdate.start();
问题是系统调用onLocationChanged()
方法,有时在线程完成之前,这会导致我的应用程序出现不可预测的行为。
如果已经在运行或类似的东西,有没有办法不运行该线程?
解决方案:
我知道发生了什么,你需要致电locationManager.removeUpdates(locationListener);
并在您的销毁活动上设置locationManager=null
,否则即使该应用关闭,该服务仍在运行并获取位置。
答案 0 :(得分:1)
有没有办法不运行线程,如果已经运行或类似的东西
您可以使用AtomicBoolean
设置一个值,告诉您是否启动该线程。然后在run()
方法的末尾,您可以将标志重置为false。
以下内容应该有效:
private final AtomicBoolean threadStarted = new AtomicBoolean(false);
...
public void onLocationChanged(Location location) {
if (threadStarted.compareAndSet(false, true)) {
// start the thread
checkUpdate = new Thread() {
public void run() {
try {
// do thread stuff here
} finally {
// when the thread finishes, set the started flag to false
threadStarted.set(false);
}
}
};
checkUpdate.start();
}
}