MVP 中 view 为空的原因是什么?

2019-11-28 21:27:04 +08:00
 lifewinner
有异步调用中 view,可能会出现为空的情况。这是由什么原因导致的呢?我在网上,看到的资料,有说过在内存不足的情况下,系统不会只针对单个 activity 进行回收,而是会对整个进程进行回收,这样的情况产生的话,那就是整个程序进行崩溃,而只不是一个 activity 为空,所以导致 activity 为空的原因到底是什么?
10606 次点击
所在节点    Android
11 条回复
lifewinner
2019-11-28 21:32:20 +08:00
想了好久都没想明白
WenhaoWu
2019-11-28 21:53:23 +08:00
不要把 Activity 和 Fragment 直接传进 Presenter,把 View 抽象成 Interface 然后 Activity implement 它。
WenhaoWu
2019-11-28 21:54:39 +08:00
可以看看我写的小 Demo github.com/WenhaoWu/PexelsPhoto
ytempest
2019-11-29 09:55:40 +08:00
P 层发起一个延时请求,在请求未完成前,activity 被回收,导致 V 为空,我好像也遇到过
ChenFanlin
2019-11-29 10:13:27 +08:00
"在内存不足的情况下,系统不会只针对单个 activity 进行回收,而是会对整个进程进行回收"
这句话如果当你的 app 在前台的时候这就不成立了呀, 可以试试 开启不保留活动+P 层发起一个延时请求 会不会重现
frantic
2019-11-29 10:36:42 +08:00
异步调用的话,如果你当前的 Activity 被销毁了,但是异步里面还调用了此 View 就会出现这个问题,需要对生命周期管理
lifewinner
2019-11-29 11:43:31 +08:00
@ChenFanlin 就是前台进程啊,为什么不成立呢
lifewinner
2019-11-29 11:44:05 +08:00
@frantic view 为什么会被销毁,原因是什么
wobuhuicode
2019-11-29 11:56:16 +08:00
感觉安卓的 MVP 就是个绕圈子的玩意。
ChenFanlin
2019-11-29 12:12:24 +08:00
@lifewinner #7
https://www.ibm.com/developerworks/cn/opensource/os-cn-android-mmry-rcycl/index.html
回收的条件是:
1.必须是非 persistent 进程,即非系统进程;
2.必须是空进程,即进程中没有任何 activity 存在。
3.必须无 broadcast receiver。运行 broadcast receiver 一般都在等待一个事件的发生,用户并不希望此类程序被系统强制关闭;
4.进程中 service 的数量必须为 0

更常见的 P 层中 view == null 的原因 : P 不应该都有 attachView, detachView 这俩方法嘛? 为了不内存泄露, 一般 detachView 在 Activity 的 onDestroy 调用, 把 P 中的 view 置空
pyfan
2019-11-29 15:00:52 +08:00
github 上传个文件 发链接,或者 Stack Overflow 发个链接,我们瞅瞅

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/624103

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX