我在片段中有一个AsyncTask,它使用Timer每秒执行一次。 AsyncTask将数据加载到ListView中,当用户单击ListView项时,它会切换到另一个片段。
计时器没有停止,所以它一直在执行,最后,当它试图将数据加载到ListView时给我一个错误。
我已经尝试过寻找答案,并在我的代码中实现了这些答案 -
class HttpGetAsyncTask extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onCancelled() {
Log.d("PORTS Cancelled","cancelled");
}
@Override
protected String doInBackground(String... q) {
String v = null, c = null;
for(int countervar=0;countervar<1;countervar++){
if(load.isCancelled())
break;
//All my code here
}
return c;
}
protected void onPostExecute(String result) {
if(isCancelled()||!isAdded()){
return;
}
else{
SimpleAdapter adapter = new SimpleAdapter(getActivity(),
ports, R.layout.playout, new String[] { "name",
"code", "type" }, new int[] { R.id.portn, R.id.portc,
R.id.portv });
adapter.notifyDataSetChanged();
lv.setAdapter(adapter);
}
}
}
@Override
public void onPause() {
super.onPause();
timer.cancel(); //timer is the name of the Timer
doAsynchronousTask.cancel(); //doAsynchronousTask is the TimerTask
if(load!=null) //load is the AsyncTask
if(!load.isCancelled())
load.cancel(true);
}
@Override
public void onDestroy() {
super.onDestroy();
timer.cancel();
doAsynchronousTask.cancel();
if(load!=null)
if(!load.isCancelled())
load.cancel(true);
}
计时器(在onCreateView
中调用) -
handler = new Handler();
doAsynchronousTask = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
public void run() {
try {
load = new HttpGetAsyncTask();
load.execute();
} catch (Exception e) {
// TODO Auto-generated catch block
}
}
});
}
};
timer.schedule(doAsynchronousTask, 0, 10000);
请让我知道我哪里出错了,我该怎么做才能解决这个问题。感谢。
答案 0 :(得分:0)
如果在循环中添加一个布尔标志作为控制循环的条件呢?
然后您可以将其设置为false以停止onPause()
中的任务答案 1 :(得分:0)
当计划doAsynchronousTask
任务时,加载变量将替换为新的HttpGetAsyncTask
。因此,多个AsyncTask
可以同时运行,当您停止任务时,请调用:
load.cancel(true);
,
你只是取消了加载变量引用的AsyncTask
,但是其他任务可以继续在backgroud中工作(没有任何句柄来阻止它们)。
解决方案可以是,在启动另一个之前停止AsyncTask。