请教下 MVP 的 View 空指针问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
ex1gtnim7d

请教下 MVP 的 View 空指针问题

  •  
  •   ex1gtnim7d Nov 26, 2019 15279 views
    This topic created in 2347 days ago, the information mentioned may be changed or developed.

    view 调用 presenter.do()方法

    do 方法的实现如下:

    do(){ view.showXXX(); }

    那么有没有可能在 view 在执行 presenter.do()方法的瞬间,View 挂了,导致 do 方法中,view 报了空指针错误?

    现在项目中跑 monkey 测试遇到了类似问题,有没有大佬帮忙解答一二?

    23 replies    2019-12-03 01:56:21 +08:00
    pdog18
        1
    pdog18  
       Nov 26, 2019
    问题描述不完整,你的这个“瞬间”让人想象不出来,写代码不能靠玄学
    sankemao
        2
    sankemao  
       Nov 26, 2019 via iPhone   1
    动态代理 v 层方法,调用前判空
    Porster
        3
    Porster  
       Nov 26, 2019
    如果 do 不是同步执行的,那 view 可能会为 null。
    比如用 handler delay 300ms 执行 do()。Activity 关闭了,此时 view=null。
    KunMinX
        4
    KunMinX  
       Nov 26, 2019
    MVP 不能解决 生命周期安全问题,可以考虑通过 DataBinding + LiveData + ViewModel 规避这类问题。

    https://juejin.im/post/5dafc49b6fb9a04e17209922
    KunMinX
        5
    KunMinX  
       Nov 26, 2019
    补充,还包括解决 视图调用等 一致性问题,避免空指针隐患。
    boileryao
        6
    boileryao  
       Nov 26, 2019
    Jetpack
    ex1gtnim7d
        7
    ex1gtnim7d  
    OP
       Nov 26, 2019
    @pdog18 说是瞬间是因为,理论上,do 能够执行到,view 就是还在的,毕竟是 view 调用的,但是 view.showxxx 又报空指针了,那我能想到的就是,在 [presenter.do 这句代码执行] ,和 [view.showxxx 这句代码执行] 之间的时间片里面,发生了 view 挂了的情况
    ex1gtnim7d
        8
    ex1gtnim7d  
    OP
       Nov 26, 2019
    @KunMinX
    @boileryao
    是的,但是项目工程没有使用这种方式,而是传统的 mvp,所以只能妥协
    ryougifujino
        9
    ryougifujino  
       Nov 27, 2019
    MVP 最典型的 View 空指针情形是,请求网络接口的时候,在结果返回之前就结束了 Activity。这个时候 View 方法里调用控件就会报空指针。
    pdog18
        10
    pdog18  
       Nov 27, 2019
    @kerb15 我觉得你把问题复杂化了,就像前面哥们说的,只要是同步的话没可能会又这样的事(同步 + 互相强引用)。
    如果又这样的情况 Java 代码完全不能写了。
    fansangg
        11
    fansangg  
       Nov 27, 2019
    do 方法用 rxjava,view 挂了的话 dispose 掉,不就完事了
    fansangg
        12
    fansangg  
       Nov 27, 2019
    fun attachView(mRootView: V)

    fun detachView()
    starerlloll
        13
    starerlloll  
       Nov 27, 2019
    kotlin:

    view?.do()

    Java:
    if(view!=null)
    {
    view.do()
    }
    Mrxxy
        14
    Mrxxy  
       Nov 27, 2019
    有可能是内存泄漏导致,view 已经被销毁,但此时耗时操作才把结果返回,最常见网络请求,可以学下下官方 Lifecycle
    lifewinner
        15
    lifewinner  
       Nov 28, 2019 via Android
    我想问问为什么 view 会为空?导致 view 为空的原因是什么?
    ex1gtnim7d
        16
    ex1gtnim7d  
    OP
       Nov 29, 2019
    @fansangg do 方法确实是用了 rxjava,然后 view.showxxx()方法是在 onSubscribe()中调用的,结果 monkey 测试报了 view 为空,确认过了 view.do()和 view.showxxx()是在同一个线程里面
    ex1gtnim7d
        17
    ex1gtnim7d  
    OP
       Nov 29, 2019
    @lifewinner 不清楚,monkey 测试报的,所以我在猜测原因
    ex1gtnim7d
        18
    ex1gtnim7d  
    OP
       Nov 29, 2019
    @starerlloll 这个确实是修复的办法,但我希望能够找到根因
    ex1gtnim7d
        19
    ex1gtnim7d  
    OP
       Nov 29, 2019
    @fansangg [更正] do 方法确实是用了 rxjava,然后 view.showxxx()方法是在 onSubscribe()中调用的,结果 monkey 测试报了 view 为空,确认过了 presenter.do()和 view.showxxx()是在同一个线程里面
    starerlloll
        20
    starerlloll  
       Nov 29, 2019
    @kerb15 那就要看你的 view 是怎么传到到 presenter 的了
    ex1gtnim7d
        21
    ex1gtnim7d  
    OP
       Nov 29, 2019
    @starerlloll 初始化 presenter 时传过去,presenter 直接强引用。
    ukyoo
        22
    ukyoo  
       Dec 2, 2019
    在 Activity(View)销毁后, Presenter 的调用了 View 的方法,当然会报空指针了, MVP MVVM 都会遇到.
    MVP 要么加个方法,要么用 autodispose 之类的框架. MVVM 在 ViewModel#onCleared()里取消观察.
    fansangg
        23
    fansangg  
       Dec 3, 2019
    @kerb15 在 activity ondestory 的 dispose 掉,我在写 Presenter 的时候会在 base 里加上绑定 view 和解绑 view 的方法
    About     Help     Advertise     Blog     API     FAQ     Solana     2402 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 46ms UTC 01:08 PVG 09:08 LAX 18:08 JFK 21:08
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86