0

アプリにログインすると、非同期タスクの実行が開始され、そのタスクが実行されていてアプリからログアウトしている間、そのタスクはまだ実行されていて、しばらくすると結果が表示されます(ログアウトしました)。結果が得られないように、そのタスクをキャンセルする方法はありますか?

  class AsyncClass extends AsyncTask<>{

    @Override
     protected String doInBackground(Void... params)
      {
             if(isCancelled())
               {
                Log.d("isCancelled", iscancelled());
               }
          //call the webservice

      }
    }

今、私が呼んでいる場所から他のクラスがあります

if(asyncTaskObject!=null){
    asyncTaskObject.cancel(true);
        asyncTaskObject=null;
}

ただし、内部の Log ステートメントiscancelled()は呼び出されません。

4

4 に答える 4

2

はい、を使用して AsyncTask をキャンセルできますcancel(boolean)。AsyncTask クラスのインスタンスを作成して呼び出すことができます。

if(task != null && task.equals(AsyncTask.Status.RUNNING))
task.cancel(true);
于 2012-06-25T10:31:05.207 に答える
1

私はちょうど1日前に同じ問題を抱えていました:)

私のために働く他の3つの答えの混合物。

まず、フィールドでasyncTaskを宣言します。

private MyTaskClass miTask;

onCreate / onResumeで、アクティビティの場合:

miTask = new MyTaskClass();

その後、任意の方法で実行できます。

miTask.execute();

そして、onPause / onStopで:

miTask.cancel(true);

これは、doInBackgroundでisCancelled()をチェックした場合にのみ機能します。これは、フラグメントが閉じられた場合にすでに閉じていたカーソルアクセスに対して作成した例です。

@Override
    protected Void doInBackground(Void... params) {
        cached = true;
        int idIndex = currentCursor.getColumnIndex(Contacts._ID);
        int displayNameIndex = currentCursor
                .getColumnIndex(Contacts.DISPLAY_NAME);

        while (currentCursor.moveToNext()) {
            if (isCancelled()) {
                break;
            }

よろしくお願いします。アレックス

于 2012-06-25T10:36:15.903 に答える
1

このリンク に従って Task.cancel(true);and isCancelled() を使用します

private class UpdateLibrary extends AsyncTask<Void, Integer, Boolean>{
    private ProgressDialog dialog = new ProgressDialog(Library.this);
    private int total = Library.instance.appState.getAvailableText().length;
    private int count = 0;

    //Used as handler to cancel task if back button is pressed
    private AsyncTask<Void, Integer, Boolean> updateTask = null;

    @Override
    protected void onPreExecute(){
        updateTask = this;
        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        dialog.setOnDismissListener(new OnDismissListener() {               
            @Override
            public void onDismiss(DialogInterface dialog) {
                updateTask.cancel(true);
            }
        });
        dialog.setMessage("Updating Library...");
        dialog.setMax(total);
        dialog.show();
    }

    @Override
    protected Boolean doInBackground(Void... arg0) {
            for (int i = 0; i < appState.getAvailableText().length;i++){
                if(isCancelled()){
                    break;
                }
                //Do your updating stuff here
            }
        }

    @Override
    protected void onProgressUpdate(Integer... progress){
        count += progress[0];
        dialog.setProgress(count);
    }

    @Override
    protected void onPostExecute(Boolean finished){
        dialog.dismiss();
        if (finished)
            DialogHelper.showMessage(Str.TEXT_UPDATELIBRARY, Str.TEXT_UPDATECOMPLETED, Library.instance);
        else {
                //Do nothing......
             }
    }
}
于 2012-06-25T10:31:47.307 に答える
1

はい、可能です。

YourAsyncTask mTask;
 if(mTask!=null) mTask.cancel(); 

ありがとう

于 2012-06-25T10:29:36.810 に答える