片段回调爆炸,如何应对?

Fragment callbacks explosion, how to deal?

我正在使用片段创建我的应用程序。我有类似 main activity 的东西,它有 FrameLayout 作为根布局来保存片段。
经过深思熟虑,我决定将我的应用程序逻辑分成几个部分,例如:MainActivity 负责应用程序基本导航(MainPageFragment, CategoryListFragment, ProductListFragment, ProductDescriptionFragment),AuthActivity 负责授权,注册(SignInFragment, RegistrationFragment, RecoverPasswordFragment).
关于我的应用程序的一些信息。如果您有建议或不同意应用程序结构,我将不胜感激。

有什么问题,你看我的MainActivity有很多职责。现在有四个Fragments,以后会更多
让我们考虑下一种情况。在我的 MainActivity 中,我有 MainPageFragment 并且这个片段反过来当然有一些观点。在单击事件上,我需要更改片段,例如从 MainPageFragment 到 CategoryListFragment。在这种情况下,我有几种方法来处理来自 framgents 的点击或其他事件。

  1. 最常见的方法是让activity实现片段class中定义的回调接口作为嵌套的class接口。这种方法很好用,也很容易上手。但是,如果我的主机 activity 必须处理来自片段的多个回调,也就是说,单个片段可能有多个回调,class(activity) 声明开始增长,class body 也是。解决这个问题的另一种可能方法是什么。

  2. 你可以直接在fragment里面处理所有的点击,事件(开始activity,替换framgent......)你可以轻松做到这一点,但对我个人来说回调方法看起来更好,但也许没有什么不好的,我可以使用这种方法。

  3. 使用一个或多个接口从片段中获取信息。例如创建 class CallbackEvent 来保存 framgentId, eventType 等信息......使用这种方法我们可以减少接口和方法,但是 Activity class body 在第一种方法中可以变大。

  4. 使用类似于 EventBus 模式的东西通过第三方服务在应用程序组件之间进行通信。

当然还有其他一些方法可以做到这一点,但我介绍的是最流行的。

请提出建议,或者只是解释一下您如何在您的应用程序中解决此问题,哪种方法更好,如何建立易于维护的通信。

非常感谢任何建议,提前批评。

  1. 如果您的应用变得更复杂,使用回调模式会变得混乱,尤其是当片段需要与片段通信时。我只会将这种模式用于复杂性较低的应用程序(activity,一个或两个片段)。
  2. 如果片段内发生的任何事情都应在片段内处理点击、事件等。不要从片段中替换片段,这是 Activity 的责任。在片段中执行 getActivity().someMethod 可能看起来更容易,但这会导致难以维护代码。你现在可能明白它在做什么,但半年后就会挣扎。
  3. 这种方法对我来说也很乱(类似于 1.)
  4. 这是我推荐的。我正在使用 EventBus (https://github.com/greenrobot/EventBus) but there are alternative implementations like Otto (https://github.com/square/otto),我再也没有回过头来使用回调模式。使用 EventBus 可以解耦不同组件之间的通信,您的代码将变得更加简单和精简。但是,您需要谨慎使用该方法,因为存在一些陷阱。一个是从任何组件到任何其他组件的通信变得更加容易,这可能导致比 listener/observer 模式更混乱的代码。另一个是与同步侦听器调用相比,事件是异步的,因此您需要确保只在组件生命周期的正确时刻接收 "right" 事件。 EventBus 方法的主要优点是 IMO:
    • 与更实用的侦听器方法调用相比,消息始终是一个对象,迫使开发人员编写面向对象的代码
    • 它解耦了不同的组件。发布者和订阅者不必相互了解。解耦组件将使您的代码更精简,更易于阅读(和维护)。
    • 它可以被任意组件使用。例如。我用 EventBus 消息替换了所有 LocalBroadcastManager 调用(EventBus 比使用 LocalBroadcastManager 快得多)。如果组件不能直接相互访问(如 Dialog 和 Preference 对象),则能够在任意组件之间进行通信特别方便

我有两个Fragment规则-Activity分离。

一个是逻辑。任何处理 View(布局扩展、显示、监听器等)的东西都应该放在 Fragment 中。重要的后台进程(http 请求、文件读取、图像处理等)应该放在 Activity 里面。我的第二点解释了部分原因:

生命周期。 Activity 的生命周期比 Fragment 的生命周期长。 Fragment 也很脆弱,它甚至不保留其视图。这就是 Fragment 应该与 Activity 解耦的原因。侦听器和回调是紧密耦合的,当某些进程试图更新已调用其 onDestroyView 的片段的视图时,它们是无数空指针异常的原因。话虽如此,我建议使用发布者 - 订阅者模式,例如事件总线,您可以在其中计划消息传递,仅当发布者(在本例中对应于 Fragment 的视图)可用时,消息才会被消化。

您拥有的众多点击监听器与您设计 UI 的方式有关。移动代码并没有多大帮助,除非你 trim 降低你的布局。