0

根据Android 开发者页面,片段通过其宿主活动进行通信。这往往会产生严格的片段 <-> 主机关系和即使是最简单的事件传播的详细实现 - 如果您有多个接收者等,情况会变得更糟。

我想提出一种对我有用的替代方法。如果您发现它有问题,请告诉我,特别是关于内存泄漏,因为我有演员在单例中注册。

总之,我有一个 EventHub 单例,其中片段将他们的事件发布到,而不关心是否有人在“另一边”收听。我的片段(或活动)正在通过其 Handler 实例向 EventHub 注册:

Activity/Fragment 监听来自其他 Fragment 的事件:

public void onResume()
{
    super.onResume();

    // Register self with the hub and start receiving events
    EventHub.getInstance().register( handler_ );
    ...
}

/** Don't leak handlers. */
@Override
public void onPause() {
    // Remove self from the event hub.
    EventHub.getInstance().unregister( handler_ );
}

/** Dispatch events. */
private Handler handler_ = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        switch( msg.what ) {
            ....
        }
    }
};

片段发射事件:

    button.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v) {
                EventHub.getInstance().post( Message m );
            }
        });
4

1 回答 1

2

我建议您不要开发自己的方法,而是看一下函数响应式编程。Observables 和朋友正是为您描述的问题而创建的。此外,只要您遵守规则,您就不必过多考虑内存泄漏。

这是初学者的教程:http: //mttkay.github.io/blog/2013/08/25/functional-reactive-programming-on-android-with-rxjava/但谷歌对此还有更多要说的:https ://www.google.hu/search?q=android+rxjava

这不是一个神奇的解决方案,乍一看它相当复杂,但如果你掌握了这个想法,那么它将帮助你的软件更简单,更安全。

否则,我看不到您提出的解决方案有很多问题,但很难保持注册一致。

于 2013-11-03T10:43:55.647 回答