如果反复启动/停止,为什么AsyncTask无法启动?

Pea*_*oto 3 multithreading android android-asynctask

所以,我一直在我的游戏中调试一个问题,如果我开始然后反复停止它,我注意到有时Asynctask似乎没有开始,即使我似乎做正确的事情让它开始.我删除了很多不必要的代码来显示会发生什么,但基本上我看到我即将启动Asynctask,但任务永远不会开始.

public void onStart()
{
    super.onStart();
    Log.d(TAG,"About to execute");
    Play_level.execute();
}

AsyncTask<Void,Integer,Integer> Play_level=new AsyncTask<Void, Integer, Integer>(){
     protected void onProgressUpdate(Integer ...time) {
            //Stuff goes in here.
     }
    @Override
    protected Integer doInBackground(Void... params) {
        Log.d(TAG,"In Task");
    }

};
Run Code Online (Sandbox Code Playgroud)

logcat显示:

03-10 19:28:16.983: D/Level(1535): About to execute
03-10 19:28:17.503: D/Level(1535): onStop()
03-10 19:28:17.993: D/Level(1535): onPause()
03-10 19:28:19.174: D/AJEG(1535): Starting Tongue
03-10 19:28:19.313: D/Level(1535): ImageList Previously Loaded
03-10 19:28:19.313: D/Level(1535): About to execute
03-10 19:28:19.853: D/Level(1535): onStop()
03-10 19:28:20.283: D/Level(1535): onPause()
03-10 19:28:21.464: D/AJEG(1535): Starting Tongue
03-10 19:28:21.604: D/Level(1535): ImageList Previously Loaded
03-10 19:28:21.604: D/Level(1535): About to execute
03-10 19:28:22.134: D/Level(1535): onStop()
03-10 19:28:22.404: D/Level(1535): onPause()
03-10 19:28:23.504: D/AJEG(1535): Starting Tongue
03-10 19:28:23.644: D/Level(1535): ImageList Previously Loaded
03-10 19:28:23.644: D/Level(1535): About to execute
03-10 19:28:24.184: D/Level(1535): onStop()
Run Code Online (Sandbox Code Playgroud)

此外,重新进入任务的数量似乎无法重新启动代码,如最后一段文本所示.

只是为了给出更多的上下文,在父活动(AJEG)的onStart()中播放Starting Tongue,Level是我正在开始的活动的名称.可以安全地忽略ImageList命令,但我已将其包含在内以保证完整性.部分内容doInBackground包括文本"Starting Level _ ",其中_是即将开始的级别.onStop()和onPause()在方法中显示Level任务的时间onStop()onPause()发生时间.

Pea*_*oto 5

因此,该问题的解决方案如本博客文章所述:

AsyncTask使用静态内部工作队列,其硬编码限制为10个元素

所以,基本上我有一个从未完成的AsyncTask,通过重新启动我的线程这么多来达到10.为了解决这个问题,我做了以下事情:

  1. 我将AsyncTask转换为一个类,并确保只有一个实例正在运行,正如mah所建议的那样.
  2. 我在onStop()命令中取消了该任务,正如Mike D在评论中所建议的那样.
  3. 我确保检查是否取消了ASyncTask doInBackground.

结果是这样的:

private LevelPlay Play_level;

public void onStop()
{
    super.onStop();
    Play_level.cancel(true);
}

public void onStart()
{
    super.onStart();
    Play_level=new LevelPlay();
    Play_level.execute();
}


class LevelPlay extends AsyncTask<Void, Integer, Integer>
{
     protected void onProgressUpdate(Integer ...time) {
     }
    @Override
    protected Integer doInBackground(Void... params) {
        Log.d(TAG,"In Task");
            Boolean keepRunning=true;
        while(keepRunning && !isCancelled ())
        {
                 //DoStuffHere
        }
     }
}
Run Code Online (Sandbox Code Playgroud)