2012-07-24 80 views
1

我想在doInBackground()AsyncTask(向用户显示某个对话框中有UI线程中的选项)做一些工作时,向用户询问一些细节,用户选择后用doInBackground()从对话框中选择参数继续工作。如何暂停AsyncTask以询问用户的详细信息?

将此参数转移到doInBackground()的最佳机制是什么?我应该如何暂停(并继续)线程做doInBackground()(也许object.wait()notify()?)?我应该使用Handler来达到这个目的吗?

+2

你为什么不走另外的AsyncTask?就像在用户输入后一样? – SALMAN 2012-07-24 18:21:13

+0

AsyncTask实际上会执行数据库版本升级...并且用户需要为新列指定一些数据。将数据库升级到多个AsyncTask ......看起来结果不会很漂亮。 – Prizoff 2012-07-24 18:24:18

+0

看来我终于成为这样的解决方案:我会要求onPreExecute()中的用户提供的所有信息... – Prizoff 2012-07-24 18:26:29

回答

4

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

  1. 您可以使用锁定对象,并执行通常的等待()/通知()的东西。你仍然需要将数据从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 
1

我希望我的回答能够肯定地解决您的问题。

//做所有下面的代码在doInBackground()的AsyncTask的方法

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  
       } 
      }); 

     } 

谢谢:)

+7

使用100%的CPU连续循环执行线程并不是一个好主意。这可以用一个简单的wait()/ notify()对代替,它会停止等待线程而不会浪费资源。 – uaraven 2012-07-24 18:46:22

+0

非常感谢您发布答案,而不是投我的票。 – SALMAN 2012-07-24 18:47:56

+2

如果你有更好的解决方案,请把它作为回答,而不是评论。谢谢 – SALMAN 2012-07-24 18:51:11

1

可以使用Callable,提交到Executor,将Executor将返回FutureTask那么你会等待while循环,直到FutureTask.isDone == true;

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

+0

这有点让事情变得比它需要的更困难,国际海事组织。 – 2012-07-24 18:48:11

+1

@Alex Lockwood我不会不同意你的看法。只有回答提请注意Executor框架 – 2012-07-24 18:49:14

+0

我只是在谈论这个有点微不足道的例子......尽管如此,它对于长期/未来的运营无疑是值得的。实际上,'AsyncTask' [文档](http://developer.android.com/reference/android/os/AsyncTask.html)也推荐它:) – 2012-07-24 18:52:28