Asynctask无法运行两次

时间:2013-11-15 15:27:27

标签: android android-asynctask android-button

当我尝试多次运行AsyncTask时,我遇到了问题。这是我的代码:

btnonoff.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {

            if (btnonoff.isChecked()){
            new main_progress_doinbackground().execute();

                   }
            }
       });
   }  

每当我检查切换按钮时,我想执行AsyncTask。第一次代码执行正常,但是当我尝试再次运行它时,它不起作用。我认为这是因为main_progress_doinbackground().execute();无法停止。我试图手动停止它,但问题存在......

这是我的Asynctask代码:

class main_progress_doinbackground extends AsyncTask<String, String, String>{
@Override
protected String doInBackground(String... params) {
dodb();
return null;

dodb()获取一些gps位置,如果它们在设备附近,它就会开始报警。

new main_progress_doinbackground().cancel(true);
main_progress_doinbackground.cancel(true);
两个都不起作用。

我尝试了这个,但它没有用。当我使用这段代码时:

btnonoff.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        if (!btnonoff.isChecked()) {
        //      new main_progress_doinbackground().cancel(true);
                main_progress_doinbackground.cancel(true);

            }

        if (btnonoff.isChecked()){

        //new main_progress_doinbackground().execute();
         main_progress_doinbackground.execute();

我给出了这个错误:

  

11-15 08:30:05.065:E / AndroidRuntime(1458):   java.lang.IllegalStateException:无法执行任务:任务是   已经开始了。

2 个答案:

答案 0 :(得分:0)

您必须定义AsyncTask对象并取消特定的对象。像这样更改你的代码:

main_progress_doinbackground myTask;
btnonoff.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            myTask = new main_progress_doinbackgroud;
            if (btnonoff.isChecked()){
            myTask.execute();

                   }
            }
       });
   }

当你想要停止这项任务时:

myTask.cancel(true);

注意:作为建议,请遵循良好的编程习惯,将班级名称main_progress_doinbackground更改为MainProgressTask。这会将您的对象定义变为:

MainProgressTask mainProgressTask;

答案 1 :(得分:0)

我认为问题的发生是因为你在AsynckTask的同一个实例上调用.execute()方法,而你不能这样做。 更确切地说:

错误的方式

// only one instance
MyAsinchTask myAsynchTask = new MyAsinchTask();

myAsynchTask.execute();
myAsynchTask.execute();

正确的方式

// two different instances
MyAsinchTask myAsynchTask = null;

myAsynchTask = new MyAsinchTask();  // first instance
myAsynchTask.execute();

myAsynchTask = new MyAsinchTask();  // second instance
myAsynchTask.execute();             // error!

尝试更正代码,确保每次调用execute()方法时都创建一个新实例。

P.S。:阅读这篇关于Java中代码和命名约定的简单文章!这很重要! basic Java code convention