事件总线不会在新活动上注册事件



我实现了一个otto总线示例。 它工作正常,但仅在我第二次访问活动时。

例如,当我加载应用程序并点击秘密消息按钮时,我被带到活动,但 toast 没有显示。然后我点击后退按钮返回主活动并再次点击显示秘密消息按钮,当我被带到秘密消息活动时,将显示 toast。 我意识到它第二次有效,因为我没有取消注册事件而造成了泄漏。

我在逻辑上缺少什么吗?

主要活动:

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;
    }
}

事件总线:

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

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

您可以在此处找到更多信息。

在这里,事件总线应用在错误的场景中,当你可以简单地通过意图或捆绑包发送数据时。在与一个活动与另一个活动的通信中,哪个更可靠。您永远不会在第一次点击时收到事件,因为事件触发是即时的,您的活动创建需要一些时间。

因此,请尝试使用捆绑包或意图来设置一个接一个的活动的通信黑白。

感谢贡献者,我现在对活动生命周期以及它如何与事件总线相适应有了更好的了解。 也就是说,您不能将事件从 MainActivity 发送到其子项,而是相反。 下面介绍了如何实现 otto 事件总线,以将简单对象从活动传递回主活动。 希望其他人能找到这个有用的:)如果可以改进,请发表评论。谢谢。

主要活动:

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);
        }
    }
}
秘密消息

活动(这是创建秘密消息的地方)

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;
    }
}

事件总线:

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

最新更新