Roh*_*kde 15 multithreading android handler broadcastreceiver
我知道广播接收器的onReceive()和Handler的handleMessage()在同一个UI线程上运行.假设我想在同一个app(进程)中的两个服务之间进行通信.我可以扩展广播接收器类并注册事件
要么
一个Handler,然后将其实例传递给另一个用于sendMessage()调用的服务.在这两种情况下,我都需要添加一些新的开关案例.但哪种方法更有效?让我们假设代码是线程安全的(没有UI更新).
Xav*_*ler 26
您不应该使用普通广播在您自己的应用之间Activities和Services内部进行通信.你应该使用本地广播!首先,你必须BroadcastReceiver为普通广播定义一个类似的东西:
private static final String ACTION_EXAMPLE = "ACTION_EXAMPLE";
private final BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if(ACTION_EXAMPLE.equals(intent.getAction())) {
...
}
}
};
Run Code Online (Sandbox Code Playgroud)
之后你就可以LocalBroadcastManager这样:
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity());
Run Code Online (Sandbox Code Playgroud)
你可以注册BroadcastReceiver像这样的(通常你注册BroadcastReciever的onResume()):
@Override
public void onResume() {
super.onResume();
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity());
IntentFilter filter = new IntentFilter(ACTION_EXAMPLE);
manager.registerReceiver(this.receiver, filter);
}
Run Code Online (Sandbox Code Playgroud)
不要忘记取消注册BroadcastReceiver后面的(in onPause()):
@Override
public void onPause() {
super.onPause();
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity());
manager.unregisterReceiver(this.receiver);
}
Run Code Online (Sandbox Code Playgroud)
最后你可以发送这样的本地广播:
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity());
manager.sendBroadcast(intent);
Run Code Online (Sandbox Code Playgroud)
Com*_*are 23
我可以扩展广播接收器类并注册事件
如果你的意思是你正在这样做LocalBroadcastManager(参见Kapeller先生对细节的出色答案)Handler,那么LocalBroadcastManager使用a 会略微提高效率Handler.但是,性能差异不应该足够重要.其他进程中的事件总线实现也是如此,例如greenrobot的EventBus和Square的Otto.所有这些都应该足够快,以至于其他问题,例如可维护性,应该是最重要的.
如果你的意思,你是通过系统广播这样做(例如,sendBroadcast()叫上Context),然后Handler,LocalBroadcastManager或其他事件总线实现将是显著更快,更安全的为好.
所有这些都假定这两个服务处于同一个过程中.
最快的解决方案是将两种服务合二为一.如果它们具有相同的寿命,则尤其如此.有很多情况下,应用程序中有2个以上的服务是合理的,但如果没有明确的理由,不要创建大量独立的小服务.
| 归档时间: |
|
| 查看次数: |
11005 次 |
| 最近记录: |