在某些情况下,我需要从misc意图中获取数据并尝试使用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);
答案 0 :(得分:0)
实际上,这是可能的。您可以指定一个处理程序,该处理程序将在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'kaaaaay” 。但是我想你知道你在做什么。