当我尝试多次运行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:无法执行任务:任务是 已经开始了。
答案 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