如何取消AsyncTask

时间:2011-04-23 21:36:04

标签: android

我使用Asynctask作为游戏的循环控制器,并注意到在活动结束后创建的线程一直在运行。

我意识到这是一个单独线程的正确行为,然后我尝试找到当应用程序进入onPause时如何结束线程的答案。

我发现了许多类似的问题,但没有直接答案,但最终提出了一种方法,所以我将在这里回答我自己的问题,希望将来可以帮助其他人。 (并且我的答案也得到了改进)

2 个答案:

答案 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();
    }
//...

}