2

doInBackground()の作業AsyncTask(UIスレッドで選択できるダイアログをユーザーに表示する)を実行している間、ユーザーに詳細を尋ねたいと思います。ユーザーが選択した後doInBackground()、ダイアログから選択したパラメーターを使用して作業を続行します。

このパラメータをに転送する最良のメカニズムは何doInBackground()ですか?スレッドの実行を一時停止(および続行)するにはどうすればよいですかdoInBackground()(多分object.wait()そしてnotify()?)?Handlerこの目的でを使用する必要がありますか?

4

3 に答える 3

4

実際にバックグラウンドタスクを開始する前に、ユーザーに入力を求めます。これが不可能な場合は、いくつかの可能性があります。

  1. ロックオブジェクトを使用して、通常のwait()/ notify()処理を実行できます。ただし、UIスレッドからバックグラウンドスレッドにデータを渡す必要があります。

  2. キューを使用してUIスレッドからバックグラウンドスレッドにデータを渡し、すべてのロックを処理させます。

このようなもの(擬似コードの一種)

class BackgroundTask extends AsyncTask<BlockingQueue<String>, ...> {
    void doInBackground(BlockingQueue<String> queue) {
      ...
      String userInput = queue.take(); // will block if queue is empty
      ...
    }
}

// Somewhere on UI thread:
   BlockingQueue<String> queue = new ArrayBlockingQueue<String>(1);
   BackgroundTask task = new BackgroundTask<BlockingQueue<String>,....>();
   task.execute(queue);
   ....
   ....
   String userInput = edit.getText().toString(); // reading user input
   queue.put(userInput); // sending it to background thread. If thread is blocked it will continue execution
于 2012-07-24T18:56:49.280 に答える
1

私の答えがあなたの問題を確実に解決することを願っています。

// AsyncTaskのdoInBackground()メソッドで以下のすべてのコードを実行します

String userInput="";

        YouActivity.this.runOnUiThread(new Runnable() {

            public void run() {


            //SHOW YOUR DIALOG HERE

            }
        });


        while("".equals(userInput))
        {
            YouActivity.this.runOnUiThread(new Runnable() {

                public void run() {

                userInput=editText.getText().toString();//fetching user input from edit Text    
                }
            });

        }

ありがとう :)

于 2012-07-24T18:27:26.597 に答える
1

を使用してCallable、に送信するとExecutorExecutorが返され、ループで;までFutureTask待機します。whileFutureTask.isDone == true

これは例ですhttp://programmingexamples.wikidot.com/futuretask

于 2012-07-24T18:46:22.187 に答える