V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
mthli
V2EX  ›  分享创造

分享一个自己昨天写的一个简单的生命周期安全的 Android 异步库: SugarTask 。

  •  
  •   mthli ·
    mthli · 2015-10-02 10:59:06 +08:00 · 2306 次点击
    这是一个创建于 3122 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目地址: https://github.com/mthli/SugarTask

    使用方法特别简单,只需要使用 SugarTask.with(Actiivity/Fragment).assign(YOUR_TASK).execute(); 即可创建一个简单的后台线程,而且不用在意后台异步操作时 Actiivity/Fragment 突然结束生命周期而导致的 OOM/NPE ,因为 SugarTask 可以实时监听当前依附的 Actiivity/Fragment 的生命周期,并且在适当时候取消在主线程的回调。

    整个实现大约只有 400 行代码,外加 100 行注释,有兴趣的同学可以使用看看,欢迎 Star/PR/Issue

    当然,如果当前实现其实并没有什么卵用的话,还请轻喷 :)

    2 条回复    2015-10-02 11:52:14 +08:00
    cameo
        1
    cameo  
       2015-10-02 11:37:14 +08:00
    为了取消任务封装这么一堆东西,而且写死了在 onStop 的时候取消,如果我想在 onPause 的时候取消怎么办?我想在 onResume 的时候恢复怎么办?而且有些场景下可能需要更精细的控制,比如在 Fragment 的 onHidden 里面也要做一些事。反过来,我自己控制生命周期,也就一行 cancel 的事。所以我认为你做的是错误的封装,弊大于利。

    不说封装,代码本身的问题:

    一、 new Message() 应该用 Message.obtain(int) 或其他同名方法。
    二、 taskMap 在主线程、后台线程都有读写操作而没有做任何同步,会有线程安全的问题,虽然你跑一两次可能碰不到。
    mthli
        2
    mthli  
    OP
       2015-10-02 11:52:14 +08:00 via Android
    @cameo 嗯。其实像 Glide 那样是最好的,可以跟随生命周期自动暂停或者加载。我大体上是参考了 Glide 的办法,只不过简化了很多。另外 taskMap 这个问题一时脑残缺少没考虑到,为了方便直接在子线程里面写了 remove ,回去修改一下。另外毕竟 Java (在我的了解范围内)是没办法直接 cancel 掉一个线程的,取消回调应该是最好的选择了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   916 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 20:50 · PVG 04:50 · LAX 13:50 · JFK 16:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.