AsyncTask重复运行报错的解决办法。

发布时间 2023-04-01 12:19:31作者: herry507

 

 

接着这节课老师讲的内容,因为AsyncTask只可以运行一次,如果你在AsyncTask运行中再次点击START按钮的话,也会引发一个崩溃报错(如图)

 

 


Cannot execute task: the task is already running.
翻译过来的意思是:无法执行任务,任务已经在运行中。
这就是在AsyncTask运行中,又点击了一次START的结果,很明显,AsyncTask任务只可以被运行一次,老师在这节课里没有讲过这个问题,不过也有其它的解决办法,我本来开始是想着Android Studio提供了某种办法,可以让一个按钮不被二次点击,然后去百度了一下,但没有找到类似的方法,所以,既然不能点两次,那就干脆只让点一次就好了。

解决办法:
1、当点击了mStart按钮的时候,将这个按钮设置为不可点击状态。
2、当点击了mStop按钮的时候,将mStart按钮设置为可点击状态。
略略略……强行禁止点击2次开始按钮!

 //启动异步任务类
        mStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mProgressTask.isCancelled()){
                    mProgressTask=new ProgressTask();
                }
                mProgressTask.execute();
                mStart.setEnabled(false);//设置为不可点击按钮
            }
        });

//打断异步任务类
        mStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mProgressTask.cancel(true);
                mStart.setEnabled(true);//将开始按钮设置为可点击状态
            }
        });

 


点击开始按钮以后:

 

 

点击结束按钮以后:

 

 

您需要创建 AsyncTask 的构造函数以将当前 Activity 上下文传递为:

   public Context ctx;

    public Your_AsyncTask_Class_Name (Context context){
        super();
        this.ctx=context;

    }
  ......
@Override
protected void onPostExecute(final String result)
{

    MainActivity.mProgressDialogDownload.dismiss();
    PreMainActivity.ENABLE_RESTART = true;
    final Intent i = new Intent(ctx, PreMainActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    startActivity(i);
}

从 Activity 中,您可以将上下文传递为:

AsyncTask_Class_Name asyktaskobj=new AsyncTask_Class_Name(this);
asyktaskobj.execute(); 

转自https://class.m.imooc.com/qadetail?qid=285308