Android和sendOrderedBroadcast - 如何立即获得结果?

时间:2014-09-01 08:54:05

标签: android events event-handling

在某些情况下,我需要从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);

1 个答案:

答案 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” 。但是我想你知道你在做什么。