Giter Site home page Giter Site logo

Comments (6)

KunMinX avatar KunMinX commented on May 21, 2024

@jamweak
感谢你的测试和反馈!
这个问题是 LiveData “设计如此” 造成的。通过 LiveData 的 observe 方法就能轻松看到对重复添加 同 Observer 但不同 LifeCycleOwner 的抛出异常处理。

为什么 LiveData 这么设计呢?
考虑到 LiveData 需要根据 LifeCycleOwner 的生命周期状态来判断是否给该 Owner 发送数据,因而唯有确保一个 Observer 只对应唯一 一个同名 Owner 实例,才能确保排他性,和状态判断的正确性。

通常 LifeCycle 会在 Owner destory 时自动解绑,从而没有上述问题。
而你遇到的这个问题,是由于 MainActivity 还在可见模式,而 通知栏重新打开了一个 MainActivity,使得同时有两个同名 Owner 试图匹配一个 Observer,从而抛出上述异常。

对此,你给的解决办法是可以的,在单 Activity 架构中,singleTop、singleTask 启动模式都是 ok 的。

from jetpack-mvvm-best-practice.

jamweak avatar jamweak commented on May 21, 2024

@KunMinX
感谢解惑!
深入思考了一下,MainActivity 中的问题,可以通过设置 lauchMode 来解决,但是在 BaseActivity 中,还有一个 NetworkStateManager.getInstance().mNetworkStateCallback,对于这个的话,似乎要想一下更常规的解决方法了。
为何不把它放到 SharedViewModel 去做全 APP 范围内的监听呢?

from jetpack-mvvm-best-practice.

KunMinX avatar KunMinX commented on May 21, 2024

@jamweak
SharedViewModel 是专职于页面间通信,NetworkStateManager 专职于网络状态管理,被封装在 Activity 基类,使得对开发者隐藏,而避免接触和改动这些内容。

后期我会在 Activity 基类添加一个网络状态空方法钩子,给 Activity 子类实现用。

from jetpack-mvvm-best-practice.

jamweak avatar jamweak commented on May 21, 2024

@KunMinX
其实我认为监听网络状态的实现使用 LiveData 有些不太合适,如果网络状态足够重要,每个 Activity 页面都需要关注的话,为什么不放到 Application 中直接注册 receiver 呢?这样的话,就不会涉及因子页面的 LifeCycle 变化而频繁 add/remove observer 了。

from jetpack-mvvm-best-practice.

KunMinX avatar KunMinX commented on May 21, 2024

@jamweak
对于网络状态,不同页面会有不同的 UI 逻辑处理,因而通过 liveData 来分发给多个页面来订阅。
而且 liveData 包含生命周期安全的设计,可以避免 Null 安全等问题。

from jetpack-mvvm-best-practice.

KunMinX avatar KunMinX commented on May 21, 2024

@jamweak
找到引发这个现象的根源的根源了,是 lambda 导致。lambda 中不可空实现,否则会被认为是同一个 Observer,
代码已更新,缘由详见:

https://stackoverflow.com/questions/47025233/android-lifecycle-library-cannot-add-the-same-observer-with-different-lifecycle

from jetpack-mvvm-best-practice.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.