1

请帮忙。我可以重新启动 AsyncTask。当第二次调用 updatePoi() 时,应用程序每次都会崩溃。

这是我的代码:

  1. 我正在检查任务的状态并设置取消(真)。

    public void updatePoi() {
        //new RefreshMapTask().execute();
        if (refreshMapTask.getStatus() == AsyncTask.Status.RUNNING || 
            refreshMapTask.getStatus() == AsyncTask.Status.PENDING) {
                refreshMapTask.cancel(true);
            }
            refreshMapTask.execute();
        }
    }
    
  2. 这是我的异步任务。在 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(); 
}
4

3 回答 3

7

一个AsyncTask实例只能被调用一次。要进行第二次调用,您需要创建一个新实例。

于 2012-11-30T09:54:15.627 回答
2

您无法重新启动任务。每个任务对象只能执行一次:

该任务只能执行一次(如果尝试第二次执行将引发异常。)

所以每次执行时都要创建一个新对象,不要使用同一个对象。

于 2012-11-30T09:55:05.597 回答
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;
}
于 2012-11-30T09:51:22.083 回答