美文网首页Android开发
别再使用AsyncTask了,它已经被正式弃用了

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

作者: DoKar | 来源:发表于2020-07-27 19:10 被阅读0次

    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果然老后浪了。

    相关文章

      网友评论

        本文标题:别再使用AsyncTask了,它已经被正式弃用了

        本文链接:https://www.haomeiwen.com/subject/nwbalktx.html