我使用Asynctask作为游戏的循环控制器,并注意到在活动结束后创建的线程一直在运行。
我意识到这是一个单独线程的正确行为,然后我尝试找到当应用程序进入onPause时如何结束线程的答案。
我发现了许多类似的问题,但没有直接答案,但最终提出了一种方法,所以我将在这里回答我自己的问题,希望将来可以帮助其他人。 (并且我的答案也得到了改进)
答案 0 :(得分:2)
首先,AsyncTask
具有完全有效的cancel()
方法。其次,不要使用 AsyncTask
进行正确的游戏循环。 AsyncTask
不适用于长时间运行。
因此,请跳过游戏循环AsyncTask
,了解如何通过reading another answer from me here on SO在普通Thread
内正确管理暂停/恢复。
答案 1 :(得分: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();
}
//...
}