接收方是否可以注册LocalBroadcastManager
以在不同的线程中执行?
我们使用
expand = FALSE
假设我希望在主线程以外的其他线程上调用void registerReceiver (BroadcastReceiver receiver, IntentFilter filter)
方法,那么我该如何实现呢?
我没有看到any API like
onReceive
答案 0 :(得分:1)
直接答案是否定的。
您必须自己处理线程。您有sendBroadcast()
和sendBroadcastSync()
。第一次调用计划事件在主线程上运行。第二个阻塞当前线程并在那里发送所有待处理的广播。
因此,调用sendBroadcastSync()
可能会对可能需要主线程的其他事件产生意外的副作用。因此,您可以更好地将接收器包装在一个知道其他线程的接收器中,以便再次重新安排事件。
public class HandlerBroadcastReceiver extends BroadcastReceiver {
private final Handler handler;
private final BroadcastReceiver receiver;
HandlerBroadcastReceiver(Handler handler, BroadcastReceiver receiver) {
this.handler = handler;
this.receiver = receiver;
}
@Override public void onReceive(Context context, Intent intent) {
handler.post(() -> receiver.onReceive(context, intent));
}
}
答案 1 :(得分:0)
我已经分叉了LocalBroadcastManager并对其进行了增强,以便能够在任意java线程上进行广播。本质上,我在registerReceiver方法中保存了一个源自新Looper参数的Handers映射。在广播时调用处理程序。同步行为保持不变。我已广泛使用它,但会欣赏任何建设性的批评。代码在这里:
public void registerReceiver(BroadcastReceiver receiver,IntentFilter filter,Looper looper)
https://github.com/sorenoid/LocalBroadcastManager
我希望它有所帮助。