请帮忙。我可以重启AsyncTask。每次第二次调用updatePoi()时,应用程序崩溃。
这是我的代码:
我正在检查任务状态并设置取消(true)。
public void updatePoi() {
//new RefreshMapTask().execute();
if (refreshMapTask.getStatus() == AsyncTask.Status.RUNNING ||
refreshMapTask.getStatus() == AsyncTask.Status.PENDING) {
refreshMapTask.cancel(true);
}
refreshMapTask.execute();
}
}
这是我的AsyncTask。在doInBackground我写了一个休息。
private class RefreshMapTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
getMapView().getOverlays().clear();
myPoiOverlay.clear();
exitOverlay.clear();
}
@Override
protected Void doInBackground(Void... voids) {
Application app = (Application)getApplication();
Log.d(TAG, "exits count = " + app.getExits().size());
GeoPoint pointToNavigate = null;
for (Exit exit : app.getExits()) {
for (Poi poi : exit.getPoi()) {
if (isCancelled()){
break;
}
//some code here
}
}
//small code here
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
getMapView().invalidate();
}
}
编辑:将评论中的解决方案添加到问题
中 public void updatePoi() {
//new RefreshMapTask().execute();
if (refreshMapTask.getStatus() == AsyncTask.Status.RUNNING ||
refreshMapTask.getStatus() == AsyncTask.Status.PENDING){
refreshMapTask.cancel(true);
refreshMapTask = new RefreshMapTask();
} else {
refreshMapTask = new RefreshMapTask();
}
refreshMapTask.execute();
}
答案 0 :(得分:7)
AsyncTask
实例只能调用一次。要进行第二次调用,您需要创建一个新实例。
答案 1 :(得分:2)
您无法重新启动任务。每个任务对象只能执行一次:
该任务只能执行一次(如果尝试第二次执行则会抛出异常。)
因此,每次执行时都要创建一个新对象,不要使用相同的对象。
答案 2 :(得分:0)
试
return null;
最终代码
@Override
protected Void doInBackground(Void... voids) {
Application app = (Application)getApplication();
Log.d(TAG, "exits count = " + app.getExits().size());
GeoPoint pointToNavigate = null;
for (Exit exit : app.getExits()) {
for (Poi poi : exit.getPoi()) {
if (isCancelled()){
return null;
}
//some code here
}
}
//small code here
return null;
}