android线程重复调用方法

时间:2012-07-26 19:02:20

标签: android multithreading geolocation

我在这个方法中有一个名为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,否则即使该应用关闭,该服务仍在运行并获取位置。

1 个答案:

答案 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();
    }
}