在某些情况下,我需要从错误意图中获取数据,并尝试使用sendOrderedBroadcast。但是这个调用是异步的,我不知道如何等待。我尝试:
onCreate(...)
{
// ...
sendOrderedBroadcast(...);
if (someResult!=null)
{
// Never executed
}
// ...
}
onButtonPressed(...)
{
if (someResult!=null)
{
// Often fires
}
}
我想我需要调用类似Windows消息循环的
while (::PeekMessage(...))
{
GetMessage(...);
}
在sendOrderedBroadcast之后和使用someResult之前。
我该怎么做?或者,还有更方便、更正确的方法吗?
UPD更多详细信息
public class DetailsChecker extends BroadcastReceiver{
public void onReceive(Context context, Intent intent)
// ...
}
// ...
sendOrderedBroadcast(detailsIntent, null, new DetailsChecker(), null,
Activity.RESULT_OK, null, null);
实际上,这是可能的。您可以指定一个将在sendOrderedbroadcast中接收响应的处理程序,这样您就可以在另一个线程上接收响应,并在处理广播时阻止UI线程。类似的东西:
final Object monitor = new Object();
HandlerThread thread = new HandlerThread("blabla");
thread.start();
synchronized (monitor) {
Intent intent = new Intent("nanana");
context.sendOrderedBroadcast(intent,
null,
new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// mystuff
someResult = tagada;
synchronized(monitor) {
monitor.notify();
}
}
},
new Handler(thread.getLooper()),
Activity.RESULT_OK,
null,
null
);
try {
monitor.wait(2000); // timeout for receiving the result
} catch (InterruptedException e) {
}
}
thread.quit();
if (someResult != null) {
// gets executed
}
当然,"阻塞UI线程是不好的,m'kaaaay"。但我想你知道你在做什么。