我目前正在编写一些代码,这些代码向外部应用程序发送意图并使用" 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()方法之前发送意图(或者至少这是我当前的理论)。这意味着在超时完成之前,接收应用程序不会收到意图。
有一种简单的方法来解决这个问题吗?我已经尝试使用不同的方法等待这个意图返回(睡眠,忙碌等待,倒计时锁定,单独的线程等)但我一直遇到同样的问题。
答案 0 :(得分:0)
当您呼叫sendOrderedBroadcast()
时,广播不会立即执行,也不会由发出呼叫的同一线程执行。广播Intent
由android框架本身发送。基本上,您正在进行异步调用并要求Android框架为您发送订购的广播。在您将控制权交还给它之前,框架将无法发送广播(即:从您的方法中return
)。您不会将控制权交还给框架,而是立即阻止。
另外,在任何情况下,你都绝对不能阻止主(UI)线程。你没有说明你在哪里调用cond.block()
,但最好是在后台线程中,而不是在主线程中。一般来说,你不应该阻止任何事情。你应该什么都不做,等待回调(或其他),并在回调到来时继续处理。