接收器被多次调用

4

我有一个从另一个应用程序获取数据的服务。

当我获取数据时,我会发送消息到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"));}

我该如何解决这个问题?

1
这个问题可能是由于您的服务发送了多个数据或者重复发送了数据。请进行调试并检查,或者打印日志以查看具体情况。 - Pankaj
服务只发送了一次,我已经检查过了。 - Wafae
方法sendMessage()只被调用一次,但onReceive()被调用多次。 - Wafae
1
你正在创建多个私有的BroadcastReceiver实例mMessageReceiver = new BroadcastReceiver(),将其设置为静态或单例以避免这种行为。 - Boris Pawlowski
在这里回答 - https://dev59.com/g2Ei5IYBdhLWcg3wZ7ka#46563020 - Rasool Mohamed
我的情况是,接收器创建多个实例,因此请确保它必须是单一的,并尝试在onCreate中创建实例。 - Agilanbu
3个回答

7
在onCreate方法中放置广播注册行,并在onDestroy()方法中取消注册。需要将下面这行代码从onResume()方法移动到onCreate方法中:
LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
            new IntentFilter("my-event"));}

4
永远不要这样做!系统不保证会调用onDestroy方法。 - stdout
@zgulser http://stackoverflow.com/questions/23846352/registering-unregistering-broadcastreceivers-on-oncreate-ondestroy - AsafK
创建广播接收器的实例对我很有效。 - Gordon developer

1
可能你有两个实例同时存在。在消息接收器上设置一个断点,检查你的活动类实例的地址,并查看每次调用onReceive时它们是否不同。
有几个原因可能导致两个实例同时存在,但最常见的原因之一是在活动中泄漏了上下文。 更多信息请参考主题

0

我通过在 onPause 方法中取消注册 BroadcastReceiver 解决了相同的问题

LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver,new IntentFilter("my-event")));

在 OnResume 方法中注册它

LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
            new IntentFilter("my-event"));}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接