2012-07-26 72 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