2

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

例如,当我加载应用程序并点击秘密消息按钮时,我被带到了活动中,但 toast 没有显示。然后我点击后退按钮返回到 MainActivity 并再次点击显示秘密消息按钮,当我被带到秘密消息活动时,会显示 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);

    }
}

MakeMySecretMessage 事件:

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() {
    }

}
4

3 回答 3

1

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

你会在这里找到更多信息。

于 2016-03-07T23:33:10.573 回答
0

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

因此,尝试使用捆绑或意图来设置通信 b/w 到一个接一个的活动。

于 2016-03-07T15:43:52.947 回答
0

感谢贡献者,我现在对活动生命周期以及它如何适应事件总线有了更好的理解。也就是说,您不能将事件从 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);
        }
    }
}

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

}

事件总线:

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

    public static Bus getInstance() {
        return Bus;
    }

    private EventBus() {
    }

}
于 2016-03-07T23:19:48.490 回答