0

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你的销毁活动,否则即使应用程序关闭,服务仍在运行并获取位置。

4

1 回答 1

1

如果已经在运行或类似的东西,有什么办法不运行线程

您可以使用 anAtomicBoolean来设置一个值,该值告诉您是否启动线程。然后在run()方法结束时,您可以将标志重置为假。

像下面这样的东西应该可以工作:

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();
    }
}
于 2012-07-26T19:03:59.923 回答