无法停止/重启AsyncTask

时间:2012-11-30 09:46:30

标签: android android-asynctask

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

这是我的代码:

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

    public void updatePoi() {
        //new RefreshMapTask().execute();
        if (refreshMapTask.getStatus() == AsyncTask.Status.RUNNING || 
            refreshMapTask.getStatus() == AsyncTask.Status.PENDING) {
                refreshMapTask.cancel(true);
            }
            refreshMapTask.execute();
        }
    }
    
  2. 这是我的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();
        }
    }
    
  3. 编辑:将评论中的解决方案添加到问题

     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(); 
    }
    

3 个答案:

答案 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;
}