我正在使用Asynctask作爲遊戲的循環控制器,並且注意到在活動完成後創建的線程保持運行。我如何取消AsyncTask
我意識到這是一個單獨的線程的正確行爲,然後我試着找到應用程序進入onPause時如何結束線程的答案。
我發現了許多類似的問題,但沒有直接的答案,但最終提出了一種方法,所以我要回答我自己的問題,希望在未來有希望幫助別人。 (並接受我的回答以及改進)
我正在使用Asynctask作爲遊戲的循環控制器,並且注意到在活動完成後創建的線程保持運行。我如何取消AsyncTask
我意識到這是一個單獨的線程的正確行爲,然後我試着找到應用程序進入onPause時如何結束線程的答案。
我發現了許多類似的問題,但沒有直接的答案,但最終提出了一種方法,所以我要回答我自己的問題,希望在未來有希望幫助別人。 (並接受我的回答以及改進)
首先,AsyncTask
有一個完全有效的cancel()
方法。其次,請勿使用AsyncTask
以獲得正確的遊戲循環。 AsyncTask
不適用於長時間運行的操作。
因此,跳過AsyncTask
爲您的遊戲循環,並學習如何正確管理暫停/恢復在Thread
reading another answer from me here on SO。
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();
}
//...
}
的AsyncTask確實有一個完全有效的cancel()方法,但我不能找到如何使用它:)作爲兼職愛好者,除非你要告訴我,如何清晰的文檔如果我使用Asynctask作爲一個簡單的循環控制器,我會用它作爲製作遊戲循環線程的一個簡單方法,真的很糟糕的事情會發生在我的應用程序中。我認爲我遵循「規則」甚至有一個單獨的線程:) – SimpleSi 2011-04-23 22:09:37
當你在你的'AsyncTask'上調用'cancel()'時,問題是一旦你恢復遊戲,你必須重新創建一個'AsyncTask'。這是不好的做法,特別是在遊戲開發中。雖然,如果你想這樣做,這是一個很好的答案,你可以如何取消一個'AsyncTask'。 http://stackoverflow.com/questions/5513855/android-asyntask-with-progress-dialog-cancel/5513904#5513904 – Wroclai 2011-04-23 22:17:09
也許我問過錯誤的問題:(在我的代碼中,我在OnPause中運行task.cancel(true)但AsyncTask並沒有結束,因此我下次啓動應用程序時會運行另一個線程:(因此我必須在我的Asynctask中包含一個this.isCancelled的檢查 – SimpleSi 2011-04-23 22:26:14