V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lifewinner
V2EX  ›  Android

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

  •  
  •   lifewinner · 2019-11-28 21:27:04 +08:00 via Android · 10656 次点击
    这是一个创建于 1855 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有异步调用中 view,可能会出现为空的情况。这是由什么原因导致的呢?我在网上,看到的资料,有说过在内存不足的情况下,系统不会只针对单个 activity 进行回收,而是会对整个进程进行回收,这样的情况产生的话,那就是整个程序进行崩溃,而只不是一个 activity 为空,所以导致 activity 为空的原因到底是什么?
    11 条回复    2019-11-29 15:00:52 +08:00
    lifewinner
        1
    lifewinner  
    OP
       2019-11-28 21:32:20 +08:00 via Android
    想了好久都没想明白
    WenhaoWu
        2
    WenhaoWu  
       2019-11-28 21:53:23 +08:00 via Android
    不要把 Activity 和 Fragment 直接传进 Presenter,把 View 抽象成 Interface 然后 Activity implement 它。
    WenhaoWu
        3
    WenhaoWu  
       2019-11-28 21:54:39 +08:00 via Android
    可以看看我写的小 Demo github.com/WenhaoWu/PexelsPhoto
    ytempest
        4
    ytempest  
       2019-11-29 09:55:40 +08:00 via Android
    P 层发起一个延时请求,在请求未完成前,activity 被回收,导致 V 为空,我好像也遇到过
    ChenFanlin
        5
    ChenFanlin  
       2019-11-29 10:13:27 +08:00
    "在内存不足的情况下,系统不会只针对单个 activity 进行回收,而是会对整个进程进行回收"
    这句话如果当你的 app 在前台的时候这就不成立了呀, 可以试试 开启不保留活动+P 层发起一个延时请求 会不会重现
    frantic
        6
    frantic  
       2019-11-29 10:36:42 +08:00
    异步调用的话,如果你当前的 Activity 被销毁了,但是异步里面还调用了此 View 就会出现这个问题,需要对生命周期管理
    lifewinner
        7
    lifewinner  
    OP
       2019-11-29 11:43:31 +08:00 via Android
    @ChenFanlin 就是前台进程啊,为什么不成立呢
    lifewinner
        8
    lifewinner  
    OP
       2019-11-29 11:44:05 +08:00 via Android
    @frantic view 为什么会被销毁,原因是什么
    wobuhuicode
        9
    wobuhuicode  
       2019-11-29 11:56:16 +08:00
    感觉安卓的 MVP 就是个绕圈子的玩意。
    ChenFanlin
        10
    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
        11
    pyfan  
       2019-11-29 15:00:52 +08:00
    github 上传个文件 发链接,或者 Stack Overflow 发个链接,我们瞅瞅
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2812 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 15:03 · PVG 23:03 · LAX 07:03 · JFK 10:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.