如何暂停AsyncTask以询问用户的详细信息?

时间:2012-07-24 18:19:10

标签: android android-asynctask

我想在doInBackground()的{​​{1}}中做一些工作时向用户询问一些细节(向用户显示一些带有UI线程选项的对话框),并在用户选择后继续AsyncTask {1}}从对话框中选择参数。

将此参数转移到doInBackground()的最佳机制是什么?我应该如何暂停(并继续)线程执行doInBackground()(可能是doInBackground()object.wait()?)?我应该为此目的使用notify()吗?

3 个答案:

答案 0 :(得分:4)

在实际启动后台任务之前,我会要求用户输入。如果不可能,有几种可能性:

  1. 您可以使用锁定对象并在其上执行常用的wait()/ notify()内容。您仍需要通过

  2. 将数据从UI线程传递到后台线程
  3. 我会使用队列将数据从UI线程传递到后台线程,并让它处理所有锁定。

  4. 像这样的东西(一种伪代码)

    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
    

答案 1 :(得分: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    
                }
            });

        }

谢谢:)

答案 2 :(得分:1)

您可以使用Callable,将其提交给ExecutorExecutor将返回FutureTask,然后您将在while循环中等待,直到{ {1}};

这是一个例子http://programmingexamples.wikidot.com/futuretask