接收者是否可以在LocalBroadcastmanager中注册以在不同的线程中执行

时间:2018-01-01 10:49:32

标签: android localbroadcastmanager

接收方是否可以注册LocalBroadcastManager以在不同的线程中执行? 我们使用

注册LocalBroadcastmanager的意图
expand = FALSE

假设我希望在主线程以外的其他线程上调用void registerReceiver (BroadcastReceiver receiver, IntentFilter filter) 方法,那么我该如何实现呢?

我没有看到any API like

onReceive

2 个答案:

答案 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

我希望它有所帮助。