2016-03-07 59 views
2

我已经实现了一个otto总线示例。它工作正常,但仅在第二次参观活动时。EventBus不会在新活动中注册事件

例如,当我加载应用程序,并击中了秘密信息按钮我带到了活动,但敬酒不显示。然后,我点击后退按钮返回到MainActivity并再次点击显示保密消息按钮,当我被带到秘密消息活动时,显示吐司。我意识到这是第二次运作,因为我没有注销事件而造成泄漏。

有什么我缺少关于逻辑是什么?

MainActivity:

public class MainActivity extends AppCompatActivity { 

    Button buttonSecretMessage; 
    Intent intentToMessage; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     intentToMessage = new Intent(MainActivity.this, SecretMessageActivity.class); 

     buttonSecretMessage = (Button) findViewById(R.id.buttonSecretMessage); 

     buttonSecretMessage.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       EventBus.getInstance().post(new MakeMySecretMessageEvent()); 
       startActivity(intentToMessage); 

      } 
     }); 
    } 
} 

秘密信息的活动:

public class SecretMessageActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_secret_message); 

    } 

    @Subscribe 
    public void getMySecretMessage(MakeMySecretMessageEvent event){ 

     Toast.makeText(this, event.getMessage(), Toast.LENGTH_SHORT).show(); 

    } 

    @Override 
    protected void onStart(){ 
     super.onStart(); 

     EventBus.getInstance().register(this); 

    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 

     //EventBus.getInstance().unregister(this); 

    } 
} 

MakeMySecretMessageEvent:

public class MakeMySecretMessageEvent { 

    public MakeMySecretMessageEvent() { 

    } 

    public String getMessage() { 

     String message = "YOU ARE AWESOME!"; 

     return message; 
    } 

} 

EventBus:

public final class EventBus extends Bus{ 
    private static final EventBus Bus = new EventBus(); 

    public static Bus getInstance() { 
     return Bus; 
    } 

    private EventBus() { 
    } 

} 
+1

因为你SecretMessageActivity不存在,当你的事件被触发,则不能接收该事件。 2次它正在工作,因为你的SecretMessageActivity实例仍在内存中。我想你会创建一个泄漏,因为你没有从EventBus注销。 – Christopher

+0

谢谢......这就是为什么注销部分被注释掉了。所以我的问题是,我怎样才能第一次开火呢? – hpCode

+0

你的用例是什么?也许你可以设置一个额外的你的意图,它启动你的SecretMessageActivity?另请参阅UMESH0492的答案。 – Christopher

回答

0

这里EventBus应用在错误的场景中,当你可以简单地通过intent或bundle发送数据。在与另一项活动交流时更可靠。一次点击就永远不会收到活动,因为事件触发是即时的,您的活动创建需要一段时间。

所以尽量陆续使用捆绑或意图建立沟通的B/W的活动之一。

+0

在这个简单的例子中,我同意一个包将是一个更简单的解决方案,但是,我只是想弄清楚如何使用事件总线将对象信息从一个活动发送到另一个活动。 – hpCode

+0

正如我上面所说,你将无法做到。与之前的第二个活动创建的事件在第一个活动中被触发,并且没有人第一次接收该事件@hpCode,因为没有事件注册发生。并且您正在接收它,因为您没有从事件注销(这会导致泄漏),以及何时再次调用该活动,并且它具有默认启动模式。先前活动的实例将调用,该实例已在该事件中注册。 – UMESH0492

+0

明白了:)....因此,我需要在开始活动之前创建第二个活动,以便它可以接收它?不知道该怎么做... – hpCode

0

感谢贡献者我现在有一个更好地了解活动的生命周期以及它如何与事件总线结合使用。那就是你不能从MainActivity发送一个事件给它的子节点,而是反过来。下面反映了如何实现一个奥托事件总线,将简单的对象从活动传递回主要活动。希望别人可以找到这个有用的:)如果这可以改进后请评论。谢谢。

主要活动:

public class MainActivity extends AppCompatActivity { 

    Button buttonSecretMessage; 
    Intent intentToMessage; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     EventBus.getInstance().register(this); 

     intentToMessage = new Intent(MainActivity.this, SecretMessageActivity.class); 

     buttonSecretMessage = (Button) findViewById(R.id.buttonSecretMessage); 

     buttonSecretMessage.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       startActivity(intentToMessage); 

      } 
     }); 
    } 
    public MakeMySecretMessageEvent event; 
    @Subscribe 
    public void getMySecretMessage(MakeMySecretMessageEvent event) { 

      Toast.makeText(this, event.getMessage(), Toast.LENGTH_SHORT).show(); 

    } 

    protected void onStop() { 
     super.onStop(); 

     if(event != null){ 

      EventBus.getInstance().unregister(this); 
     } 
    } 
} 

SecretMessageActivity(这是在其中创建秘密消息)

public class SecretMessageActivity extends AppCompatActivity { 

    Button buttonClickToMeToSeeMessage; 
    Intent intentToMain; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_secret_message); 

     intentToMain = new Intent(SecretMessageActivity.this, MainActivity.class); 

     buttonClickToMeToSeeMessage = (Button) findViewById(R.id.buttonClickToMeToSeeMessage); 

     buttonClickToMeToSeeMessage.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       MakeMySecretMessageEvent makeMySecretMessageEvent = new MakeMySecretMessageEvent(); 

       EventBus.getInstance().post(makeMySecretMessageEvent); 

       startActivity(intentToMain); 

      } 
     }); 

    } 

} 

MakeMySecretMessageEvent

public class MakeMySecretMessageEvent { 

    public MakeMySecretMessageEvent() { 

    } 

    public String getMessage() { 

     String message = "YOU ARE AWESOME!"; 

     return message; 
    } 

} 

EventBus:

public final class EventBus extends Bus{ 
    private static final EventBus Bus = new EventBus(); 

    public static Bus getInstance() { 
     return Bus; 
    } 

    private EventBus() { 
    } 

} 
1

您可以使用EventBus库发送粘性事件。它允许您将事件发送到尚未创建的组件。

您`ll获取更多here

+0

很高兴知道!谢谢! – hpCode