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

2015-10-02 10:59:06 +08:00
 mthli
项目地址: 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]( https://github.com/mthli/SugarTask "SugarTask") 。

当然,如果当前实现其实并没有什么卵用的话,还请轻喷 :)
2312 次点击
所在节点    分享创造
2 条回复
cameo
2015-10-02 11:37:14 +08:00
为了取消任务封装这么一堆东西,而且写死了在 onStop 的时候取消,如果我想在 onPause 的时候取消怎么办?我想在 onResume 的时候恢复怎么办?而且有些场景下可能需要更精细的控制,比如在 Fragment 的 onHidden 里面也要做一些事。反过来,我自己控制生命周期,也就一行 cancel 的事。所以我认为你做的是错误的封装,弊大于利。

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

一、 new Message() 应该用 Message.obtain(int) 或其他同名方法。
二、 taskMap 在主线程、后台线程都有读写操作而没有做任何同步,会有线程安全的问题,虽然你跑一两次可能碰不到。
mthli
2015-10-02 11:52:14 +08:00
@cameo 嗯。其实像 Glide 那样是最好的,可以跟随生命周期自动暂停或者加载。我大体上是参考了 Glide 的办法,只不过简化了很多。另外 taskMap 这个问题一时脑残缺少没考虑到,为了方便直接在子线程里面写了 remove ,回去修改一下。另外毕竟 Java (在我的了解范围内)是没办法直接 cancel 掉一个线程的,取消回调应该是最好的选择了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/225187

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX