onReceive 调用了很多次
Posted
技术标签:
【中文标题】onReceive 调用了很多次【英文标题】:onReceive called many times 【发布时间】:2015-04-06 12:01:58 【问题描述】:我有一个从其他应用程序获取数据的服务。
当我得到日期时,我会向 broadCast
发送消息以刷新 UI。
onReceive
方法被多次调用,数据多次显示。
这是我的代码:
DataService.java
if(sizeLat == 1)
sendMessage("Alerte1;");
else
sendMessage("Alerte2;");
private void sendMessage(String message)
Log.w("","==> send message");
Intent intent = new Intent("my-event");
// add data
intent.putExtra("message", message);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
MainActivity.java
// handler for received Intents for the "my-event" event
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver()
@Override
public void onReceive(Context context, Intent intent)
Log.e("","Onreceiver");
String message = intent.getStringExtra("message");
if(message.equals("Alerte1"))
parentItems.add(message);
adapter.notifyDataSetChanged();
;
@Override
protected void onResume()
Log.d(TAG, "On Resume");
super.onResume();
// Register mMessageReceiver to receive messages.
LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
new IntentFilter("my-event"));
我该如何解决这个问题?
【问题讨论】:
这个问题可能是您的服务检查您的服务是否向您发送了多个数据,或者可能是多次发送数据。进行调试并检查它或打印日志以查看到底发生了什么。 没有服务只发送一次,我确认了 方法 sendmessage() 被调用一次,但 onReceive() 被调用多次 您正在创建私有 BroadcastReceiver mMessageReceiver = new BroadcastReceiver() 的多个实例,将其设为静态或单例以避免这种行为。 在这里回答 - ***.com/a/46563020/7758211 【参考方案1】:将广播注册行放入 onCreate 并在 onDestroy() 方法中取消注册。您必须从 onResume() 移动到 onCreate 的行是:-
LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
new IntentFilter("my-event"));
【讨论】:
永远不要那样做! onDestroy 不保证被系统调用。 @zgulser ***.com/questions/23846352/… 创建广播接收器的实例对我有用。【参考方案2】:您可能同时存在两个活动实例。在消息接收器上打断点,检查你的活动类实例的地址,看看每次调用 onReceive 时它们是否不同。
可能有两个实例同时存在的原因有几个,但最常见的原因之一是在活动中泄漏上下文。 更多关于这个topic。
【讨论】:
【参考方案3】:我通过在 onPause 方法中取消注册 BroadcastReceiver 解决了同样的问题
LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver,new IntentFilter("my-event")));
在 OnResume 方法中注册
LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, 新的 IntentFilter("my-event"));
【讨论】:
以上是关于onReceive 调用了很多次的主要内容,如果未能解决你的问题,请参考以下文章
android广播接收器中未调用onReceive()进行静态广播
BroadcastReceiver onReceive方法没有被调用?
CAsyncSocket::OnReceive 未在 DLL 中调用