view 调用 presenter.do()方法
do 方法的实现如下:
do(){ view.showXXX(); }
那么有没有可能在 view 在执行 presenter.do()方法的瞬间,View 挂了,导致 do 方法中,view 报了空指针错误?
现在项目中跑 monkey 测试遇到了类似问题,有没有大佬帮忙解答一二?
view 调用 presenter.do()方法
do 方法的实现如下:
do(){ view.showXXX(); }
那么有没有可能在 view 在执行 presenter.do()方法的瞬间,View 挂了,导致 do 方法中,view 报了空指针错误?
现在项目中跑 monkey 测试遇到了类似问题,有没有大佬帮忙解答一二?
|
pdog18Nov 26, 2019
1
问题描述不完整,你的这个“瞬间”让人想象不出来,写代码不能靠玄学
|
|
2
动态代理 v 层方法,调用前判空
|
|
PorsterNov 26, 2019
3
如果 do 不是同步执行的,那 view 可能会为 null。
比如用 handler delay 300ms 执行 do()。Activity 关闭了,此时 view=null。 |
|
KunMinXNov 26, 2019
4
MVP 不能解决 生命周期安全问题,可以考虑通过 DataBinding + LiveData + ViewModel 规避这类问题。
https://juejin.im/post/5dafc49b6fb9a04e17209922 |
|
KunMinXNov 26, 2019
5
补充,还包括解决 视图调用等 一致性问题,避免空指针隐患。
|
|
boileryaoNov 26, 2019
6
Jetpack
|
|
7
@pdog18 说是瞬间是因为,理论上,do 能够执行到,view 就是还在的,毕竟是 view 调用的,但是 view.showxxx 又报空指针了,那我能想到的就是,在 [presenter.do 这句代码执行] ,和 [view.showxxx 这句代码执行] 之间的时间片里面,发生了 view 挂了的情况
|
|
8
|
|
ryougifujinoNov 27, 2019
9
MVP 最典型的 View 空指针情形是,请求网络接口的时候,在结果返回之前就结束了 Activity。这个时候 View 方法里调用控件就会报空指针。
|
|
pdog18Nov 27, 2019
10
@kerb15 我觉得你把问题复杂化了,就像前面哥们说的,只要是同步的话没可能会又这样的事(同步 + 互相强引用)。
如果又这样的情况 Java 代码完全不能写了。 |
|
fansanggNov 27, 2019
11
do 方法用 rxjava,view 挂了的话 dispose 掉,不就完事了
|
|
fansanggNov 27, 2019
12
fun attachView(mRootView: V)
fun detachView() |
|
starerllollNov 27, 2019
13
|
|
MrxxyNov 27, 2019
14
有可能是内存泄漏导致,view 已经被销毁,但此时耗时操作才把结果返回,最常见网络请求,可以学下下官方 Lifecycle
|
|
lifewinnerNov 28, 2019 via Android
15
我想问问为什么 view 会为空?导致 view 为空的原因是什么?
|
|
16
|
|
17
@lifewinner 不清楚,monkey 测试报的,所以我在猜测原因
|
|
18
@starerlloll 这个确实是修复的办法,但我希望能够找到根因
|
|
19
@fansangg [更正] do 方法确实是用了 rxjava,然后 view.showxxx()方法是在 onSubscribe()中调用的,结果 monkey 测试报了 view 为空,确认过了 presenter.do()和 view.showxxx()是在同一个线程里面
|
|
starerllollNov 29, 2019
20
@kerb15 那就要看你的 view 是怎么传到到 presenter 的了
|
|
21
@starerlloll 初始化 presenter 时传过去,presenter 直接强引用。
|
|
ukyooDec 2, 2019
22
在 Activity(View)销毁后, Presenter 的调用了 View 的方法,当然会报空指针了, MVP MVVM 都会遇到.
MVP 要么加个方法,要么用 autodispose 之类的框架. MVVM 在 ViewModel#onCleared()里取消观察. |