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