2012-07-26 35 views
0

我有一个线程调用checkUpdate这个方法里面:反复调用方法Android的线程

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()方法由系统调用,线程完成有时会之前,这将导致不可预知的行为在我的应用程序。

有没有办法不运行线程,如果已经运行或类似的东西?


SOLUTION:

我知道发生了什么事情,你需要调用locationManager.removeUpdates(locationListener); ,并设置你的破坏活动locationManager=null,否则即使应用程序被关闭,该服务仍在运行和获取位置。

回答

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(); 
    } 
} 
+0

它不工作,threadStarted永远是假的 – Xenione 2012-07-26 19:35:44

+0

我没有看到有问题的代码@Xenione。你可以把一些登录,看看线程是否正在启动? – Gray 2012-07-26 19:37:38

+0

好的。可能是处理程序有问题,可能因为我必须在处理程序任务完成时将threadStarted设置为True。do你知道该怎么做?谢谢 – Xenione 2012-07-26 19:52:10