我会要求用户输入实际启动后台任务之前。如果这是不可能的,有几种可能性:
您可以使用锁定对象,并执行通常的等待()/通知()的东西。你仍然需要将数据从UI线程传递到后台线程
我将使用队列将数据从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
你为什么不走另外的AsyncTask?就像在用户输入后一样? – SALMAN 2012-07-24 18:21:13
AsyncTask实际上会执行数据库版本升级...并且用户需要为新列指定一些数据。将数据库升级到多个AsyncTask ......看起来结果不会很漂亮。 – Prizoff 2012-07-24 18:24:18
看来我终于成为这样的解决方案:我会要求onPreExecute()中的用户提供的所有信息... – Prizoff 2012-07-24 18:26:29