2011-04-23 63 views
1

我正在使用Asynctask作爲遊戲的循環控制器,並且注意到在活動完成後創建的線程保持運行。我如何取消AsyncTask

我意識到這是一個單獨的線程的正確行爲,然後我試着找到應用程序進入onPause時如何結束線程的答案。

我發現了許多類似的問題,但沒有直接的答案,但最終提出了一種方法,所以我要回答我自己的問題,希望在未來有希望幫助別人。 (並接受我的回答以及改進)

回答

2

首先,AsyncTask有一個完全有效的cancel()方法。其次,請勿使用AsyncTask以獲得正確的遊戲循環。 AsyncTask不適用於長時間運行的操作。

因此,跳過AsyncTask爲您的遊戲循環,並學習如何正確管理暫停/恢復在Threadreading another answer from me here on SO

+0

的AsyncTask確實有一個完全有效的cancel()方法,但我不能找到如何使用它:)作爲兼職愛好者,除非你要告訴我,如何清晰的文檔如果我使用Asynctask作爲一個簡單的循環控制器,我會用它作爲製作遊戲循環線程的一個簡單方法,真的很糟糕的事情會發生在我的應用程序中。我認爲我遵循「規則」甚至有一個單獨的線程:) – SimpleSi 2011-04-23 22:09:37

+0

當你在你的'AsyncTask'上調用'cancel()'時,問題是一旦你恢復遊戲,你必須重新創建一個'AsyncTask'。這是不好的做法,特別是在遊戲開發中。雖然,如果你想這樣做,這是一個很好的答案,你可以如何取消一個'AsyncTask'。 http://stackoverflow.com/questions/5513855/android-asyntask-with-progress-dialog-cancel/5513904#5513904 – Wroclai 2011-04-23 22:17:09

+0

也許我問過錯誤的問題:(在我的代碼中,我在OnPause中運行task.cancel(true)但AsyncTask並沒有結束,因此我下次啓動應用程序時會運行另一個線程:(因此我必須在我的Asynctask中包含一個this.isCancelled的檢查 – SimpleSi 2011-04-23 22:26:14

0
public class CamOverlayTest extends Activity { 
//... 
public static BackgroundLoop BackgroundLoopTask; 
//... 

@Override 
protected void onResume() { 
    //... 

    BackgroundLoopTask = new BackgroundLoop(); 
    BackgroundLoopTask.execute(); 


} 

@Override 
protected void onPause() { 
    //... 
    BackgroundLoopTask.cancel(true); 
} 

private class BackgroundLoop extends AsyncTask<Void,Integer,Boolean> { 

    @Override 
    protected Boolean doInBackground(Void... arg0) { 
     int count =0; 

     while (!this.isCancelled()) { 
     // Basically, this is where the loop checks if the Aysnctask has been asked to be 
     // cancelled - if so - it exits. 
      try { 
       Thread.sleep(1000); 
       updatePhysics(count); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      count +=1; 
      Log.i("SW","Count: "+count); 
      publishProgress(); 

     } 
     return true; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     // swDrawOnTop is my view 
     swDrawOnTop.invalidate(); 
    } 
//... 

}