我想在doInBackground()
的{{1}}中做一些工作时向用户询问一些细节(向用户显示一些带有UI线程选项的对话框),并在用户选择后继续AsyncTask
{1}}从对话框中选择参数。
将此参数转移到doInBackground()
的最佳机制是什么?我应该如何暂停(并继续)线程执行doInBackground()
(可能是doInBackground()
和object.wait()
?)?我应该为此目的使用notify()
吗?
答案 0 :(得分:4)
在实际启动后台任务之前,我会要求用户输入。如果不可能,有几种可能性:
您可以使用锁定对象并在其上执行常用的wait()/ notify()内容。您仍需要通过
我会使用队列将数据从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 :(得分: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
,将其提交给Executor
,Executor
将返回FutureTask
,然后您将在while
循环中等待,直到{ {1}};