1

助けてください。AsyncTaskを再起動できます。updatePoi()を2回呼び出すと、アプリが毎回クラッシュします。

これが私のコードです:

  1. タスクのステータスを確認し、cancel(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();
        }
    }
    

編集:コメントから質問に解決策を追加しました

 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インスタンスは1回だけ呼び出すことができます。2回目の呼び出しを行うには、新しいインスタンスを作成する必要があります。

于 2012-11-30T09:54:15.627 に答える
2

タスクを再開することはできません。各タスクオブジェクトは1回だけ実行できます。

タスクは1回だけ実行できます(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 に答える