线程通过等待意图阻止自己发送意图

时间:2016-09-08 19:17:37

标签: java android android-intent

我目前正在编写一些代码,这些代码向外部应用程序发送意图并使用" sendOrderedBroadcast()"等待响应。和条件变量。在执行此操作时,我设法阻止在尝试等待外部应用程序的响应时发出意图。

我的代码看起来像这样:

final ConditionVariable cond = new ConditionVariable();
BroadcastReceiver responseReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context arg0, Intent arg1) {
        //set data values here
        cond.open();
    }
};
sendOrderedBroadcast(intent, null, responseReceiver , null, 0, null, null);
cond.block(TIMEOUT);

场景是当应用程序以每秒2-3次的速率触发此段代码时,sendOrderedBroadcast实际上并不会在调用block()方法之前发送意图(或者至少这是我当前的理论)。这意味着在超时完成之前,接收应用程序不会收到意图。

有一种简单的方法来解决这个问题吗?我已经尝试使用不同的方法等待这个意图返回(睡眠,忙碌等待,倒计时锁定,单独的线程等)但我一直遇到同样的问题。

1 个答案:

答案 0 :(得分:0)

当您呼叫sendOrderedBroadcast()时,广播不会立即执行,也不会由发出呼叫的同一线程执行。广播Intent由android框架本身发送。基本上,您正在进行异步调用并要求Android框架为您发送订购的广播。在您将控制权交还给它之前,框架将无法发送广播(即:从您的方法中return)。您不会将控制权交还给框架,而是立即阻止。

另外,在任何情况下,你都绝对不能阻止主(UI)线程。你没有说明你在哪里调用cond.block(),但最好是在后台线程中,而不是在主线程中。一般来说,你不应该阻止任何事情。你应该什么都不做,等待回调(或其他),并在回调到来时继续处理。