【问题标题】:Communicating with Other Fragments - alternative design与其他片段通信 - 替代设计
【发布时间】:2013-11-03 10:21:28
【问题描述】:

根据Android developer pages,片段通过其宿主活动进行通信。这往往会产生僵化的片段 主机关系和冗长的实现,即使是最简单的事件传播 - 如果您有多个接收者等,情况会变得更糟。

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

总之,我有一个 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 );
            }
        });

【问题讨论】:

  • 不要重新发明轮子!有很多替代解决方案,如总线(EventBus、Otto)或 FRP(rxjava),经过测试更稳定。

标签: android android-fragments singleton communication


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    相关资源
    最近更新 更多