0

私は次のものを持っていますAsyncTask

public class LoadFromCloudTask extends AsyncTask<Void, String, Boolean> {

    public LoadFromCloudTask(LoadFromCloudTaskFragment loadFromCloudTaskFragment) {
        this.loadFromCloudTaskFragment = loadFromCloudTaskFragment;
    }

    @Override
    protected Boolean doInBackground(Void... params) {
        ...
        ...
        ...
        // How possible I can halt my execution, prompt for user input, and continue execution based on user input.
        // In Swing, I can ...
        //
        /*
           // Hold the execution, and prompt for user input
           final int result = JOptionPane.showConfirmDialog(LoadFromCloudJDialog.this, message, MessagesBundle.getString("question_title_overwrite_your_data_by_cloud_data_at"), JOptionPane.YES_NO_OPTION);
           // Continue execution based on user input.
         */
    }
}

AsyncTask の実行を停止し、ユーザー入力を求め、ユーザー入力に基づいて実行を継続することは可能でしょうか?

Swing では、 を使用するだけでこれを実現できJOptionPane.showConfirmDialogます。アンドロイドはどうですか?

4

4 に答える 4

1

Asynctaskのドキュメントを確認してください。非同期タスクをキャンセルして再起動できます。The task can be executed only once

この理想的な方法でキャンセルする実行中の非同期タスクのようなものが欲しいかもしれません

doInBackground は UI スレッドで実行されないため、ダイアログを表示する UI 操作を実行できます。

于 2013-03-16T08:23:53.790 に答える
1
You can create pause and resume method inside asyntask as below, and call it according to your convenience.

        public class LoadFromCloudTask extends AsyncTask<Void, String, Boolean> {

            public LoadFromCloudTask(LoadFromCloudTaskFragment loadFromCloudTaskFragment) {
                this.loadFromCloudTaskFragment = loadFromCloudTaskFragment;
            }

    //call this when you want to halt the task        
                    public void pause() {
                           if (this.getStatus().equals(Status.RUNNING)) {
                                   try {
                                           this.wait();
                                   } catch (InterruptedException e) {
                                           e.printStackTrace();
                                   }
                           }
                   }

    // call this when you need to resume the task
                   public void resume() {
                           if (this.getStatus().equals(Status.PENDING)) {
                                   this.notify();
                           }
                   }

            @Override
            protected Boolean doInBackground(Void... params) {
                ...
                ...
                ...
                // How possible I can halt my execution, prompt for user input, and continue execution based on user input.
                // In Swing, I can ...
                //
                /*
                   // Hold the execution, and prompt for user input
                   final int result = JOptionPane.showConfirmDialog(LoadFromCloudJDialog.this, message, MessagesBundle.getString("question_title_overwrite_your_data_by_cloud_data_at"), JOptionPane.YES_NO_OPTION);
                   // Continue execution based on user input.
                 */
            }
        }
于 2013-03-16T10:32:59.803 に答える
1

これを実現するには、内部からUIThreadにメッセージを送信し、Java の待機/通知メカニズムを使用して、ユーザーが入力を入力するまで待機します。publishProgressdoInBackground(Params...)

疑似コードは次のようになります。

 public Object mLock = new Object();
 protected void doInBackground(Params... params){
  /// do your requests.
  publishProgress(Progress ...progress);
  mLock.wait();

 }
 protected void onProgressUpdate(Progress ....progress) {
    // request user input here
 }

UIThread から呼び出しmLock.notify()て、コードに続行するように依頼するだけです。

また、ロジックを複数の AsynchTask に分割することで、よりスリムな動作を実行できます。AsynchTask は共有 (静的) ThreadPoolExecutor と

于 2013-03-16T08:54:08.883 に答える
1

doInBackground別のスレッドで実行されるため、UI スレッドでいくつかのダイアログを表示している間、このスレッドを一時停止する必要があります。ダイアログ閉じたら、再開しAsyncTaskて結果を読み取ることができます。

于 2013-03-16T08:21:54.490 に答える