别再使用AsyncTask了,它已经被正式弃用了

AsyncTask

长久以来,AsyncTask在Android开发中一直扮演着一个重要的角色,它主要用于执行一些不太长的异步任务。作为用来替代Thread + Handler的辅助类,AsyncTask可以很轻松地执行异步任务并更新ui,但由于context泄露,回调遗漏,configuration变化导致崩溃,平台差异性等原因,在api 30(Android 11)中AsyncTask被正式废弃:


deprecated!

被弃用后,Android给出了两个替代的建议:

  1. java.util.concurrent包下的相关类,如ExecutorThreadPoolExecutorFutureTask
  2. kotlin并发工具,那就是协程 - Coroutines了。

Coroutines

随着kotlin在Android开发中的逐渐主流化,协程的地位也在不断提高,在Android开发者官网的kotlin页面中,能看到协程作为其特性之一被列出来:

协程已经被官方钦定

谷歌为何推荐使用协程?
个人认为,第一个原因是kotlin,作为谷歌干儿子的kotlin已经成为Android首要开发语言,协程作为其特性之一,被钦定为AsyncTask的替代者也很正常。
而更重要的原因,kotlin的协程具有很多优点,在Android上大有可为:

  1. 结构化并发,用同步的方式写异步代码,可以帮助减少内存泄露等问题。
  2. 不需要写回调,使异步代码清晰,简洁。
  3. 支持取消,可以很好地与Activity/Fragment的生命周期搭配使用。
  4. 轻量级:协程是轻量级的线程,可以在一个线程上运行多个协程,协程支持暂停而不会造成线程阻塞。

协程的简单使用(一个有点抽象的新闻加载例子)

  1. Retrofit:使用suspend关键字修饰接口:
@GET("news?type=latest")
suspend fun getLatestNews() : List<News>
  1. 定义CoroutineScope:
private val coroutineScope = CoroutineScope(Dispatchers.Main)
  1. 异步代码
private fun loadNews() = coroutineScope.launch {
    val news = newsService.getLatestNews()
    newsAdapter.updateList(news)
}
  1. 同时,由于支持取消,可以很轻松地在Activity销毁时取消任务:
override fun onDestroy() {
    super.onDestroy()
    coroutineScope.cancel()
}

如果使用了lifecycle库,可以在Activity直接使用lifecycleScope,在ViewModel中使用viewModelScope,这样一来。我们无需手动定义CoroutineScope和取消任务。

对于协程的异常处理,我们可以直接在协程代码中捕获:

val news = try {
    newsService.getLatestNews()
} catch (e: Exception) {
    null
}

也可以使用CoroutineExceptionHandler

private val errorHandler = CoroutineExceptionHandler {  coroutineContext, e ->
    // Handle error  
}

在定义coroutineScope时:

private val coroutineScope = CoroutineScope(Dispatchers.Main + errorHandler)

或在调用coroutineScope.launch()时:

fun loadNews() = coroutineScope.launch(errorHandler) {
}



在RxJava在Android上兴起之时,面对如此优雅而强大的对手,可以预想到自身不足的AsyncTask肯定会被淘汰,没想到最后把它打倒的却是kotlin的协程,kotlin果然老后浪了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352