Comments (6)
@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.
@KunMinX
感谢解惑!
深入思考了一下,MainActivity 中的问题,可以通过设置 lauchMode 来解决,但是在 BaseActivity 中,还有一个 NetworkStateManager.getInstance().mNetworkStateCallback,对于这个的话,似乎要想一下更常规的解决方法了。
为何不把它放到 SharedViewModel 去做全 APP 范围内的监听呢?
from jetpack-mvvm-best-practice.
@jamweak
SharedViewModel 是专职于页面间通信,NetworkStateManager 专职于网络状态管理,被封装在 Activity 基类,使得对开发者隐藏,而避免接触和改动这些内容。
后期我会在 Activity 基类添加一个网络状态空方法钩子,给 Activity 子类实现用。
from jetpack-mvvm-best-practice.
@KunMinX
其实我认为监听网络状态的实现使用 LiveData 有些不太合适,如果网络状态足够重要,每个 Activity 页面都需要关注的话,为什么不放到 Application 中直接注册 receiver 呢?这样的话,就不会涉及因子页面的 LifeCycle 变化而频繁 add/remove observer 了。
from jetpack-mvvm-best-practice.
@jamweak
对于网络状态,不同页面会有不同的 UI 逻辑处理,因而通过 liveData 来分发给多个页面来订阅。
而且 liveData 包含生命周期安全的设计,可以避免 Null 安全等问题。
from jetpack-mvvm-best-practice.
@jamweak
找到引发这个现象的根源的根源了,是 lambda 导致。lambda 中不可空实现,否则会被认为是同一个 Observer,
代码已更新,缘由详见:
from jetpack-mvvm-best-practice.
Related Issues (20)
- Navigation 启动新页面并关闭当前页面的功能如何实现? HOT 1
- 框架设计咨询 HOT 1
- ShareViewModel的一些疑问 HOT 4
- 底部播放器提示风险警告水印:”PlayerFragment 未遵循 Databinding 严格模式,存在 null 安全风险“ HOT 7
- 下载模拟显示问题 HOT 1
- PlayerFragment does not follow the DataBinding strict mode, there is a Null security risk of view calls. HOT 1
- 在 Activity 或 Fragment 不直接获取 View 的话,如何手动控制焦点(focus)? HOT 2
- APP点击搜索框时崩溃 HOT 5
- 能否解决navigation args在多个模块传数据的问题? HOT 1
- ui.state.State在哪? HOT 1
- 请教在使用Databinding时Activity不获取 view 实例的原则下, Activity如何调用自定义View的方法, HOT 1
- [个人见解] 本项目的设计对于简单需求过于复杂,导致预期修改正确比较困难。 搜索了一下 login 这个功能点,该页面的正确性关联7个文件。 HOT 1
- 两个Activity如何共用一个ViewModel? HOT 1
- RecyclerView列表多项同时发送请求,如何优雅实现?
- 继承MviDispatcher的类,使用getApplicationScopeViewModel()创建,App覆盖安装apk自动重启app的时候,会报错Cannot add the same observer with different lifecycles
- cannot fid BaseAlbumItem
- ViewDataBinding 不暴露给实现Activity问题 HOT 2
- 快速点击播放按钮, Crash HOT 1
- 为什么不转成kotlin HOT 1
- RecyclerView中的适配器问题
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from jetpack-mvvm-best-practice.