AsyncTask 从 Android R 中弃用。任何替代代码?

Posted

技术标签:

【中文标题】AsyncTask 从 Android R 中弃用。任何替代代码?【英文标题】:AsyncTask deprecated from Android R. Any alternatives codes? 【发布时间】:2020-09-09 04:07:07 【问题描述】:

由于 android R 已弃用 AsyncTask,因此我无法解析或接受来自 webhttp://plantplaces.com/perl/mobile/flashcard.pl 的 JSON 数据。所以我所做的是。我创建了一个名为 DownloadingObject 的 kotlin 类。下面是代码

类下载对象

@Throws(IOException::class)
fun downloadJSONDataFromLink(link: String): String 
    val stringBuilder: StringBuilder = StringBuilder()

    val url: URL = URL(link)
    val urlConnection = url.openConnection() as HttpURLConnection
    try 
        val bufferedInputString: BufferedInputStream =
            BufferedInputStream(urlConnection.inputStream)
        val bufferedReader: BufferedReader =
            BufferedReader(InputStreamReader(bufferedInputString))
        // temporary string to hold each line read from the BufferedReader.
        var inputLineString: String?
        inputLineString = bufferedReader.readLine()
        while (inputLineString != null) 
            stringBuilder.append(inputLineString)
            inputLineString = bufferedReader.readLine()
        
     finally 
        // regardless of success of Try Block or failure of Try Block, we will disconnect from the URLConnection.
        urlConnection.disconnect()
    
    return stringBuilder.toString()

我必须在后台运行这个下载任务。下面是代码

内部类 DownloadingPlantTask : AsyncTask>()

    override fun doInBackground(vararg params: String?): List<Plant>? 


        // Can access background thread. Not user interface thread

        val downloadingObject: DownloadingObject = DownloadingObject()
        var jsonData = downloadingObject.downloadJSONDataFromLink(
            "http://plantplaces.com/perl/mobile/flashcard.pl"
        )

        Log.i("JSON", jsonData)

        return null
    

如果有人可以提供任何替代代码,请提供。我只是 Android 开发的初学者。

【问题讨论】:

“我创建了一个名为 DownloadingObject 的 kotlin 类”——使用 OkHttp 会更简单,因为它内置了异步请求选项 (enqueue())。 【参考方案1】:

有几种方法可以在 Android 上实现多线程。由于您使用的是 Kotlin,您可能需要查看 Kotlin Coroutines。还有一些其他的东西是 java.concurrent.* 包和 RxJava,但在我看来,协程对初学者更友好,它们与 Android 组件的集成非常好。

使用协程,您的代码将如下所示:

@Throws(IOException::class)
suspend fun downloadJSONDataFromLink(link: String): String  ... 

GlobalScope.launch 
    val downloadingObject = DownloadingObject()
    val jsonData = downloadingObject.downloadJSONDataFromLink("http://plantplaces.com/perl/mobile/flashcard.pl")
    Log.i("JSON", jsonData)

suspend 关键字表示该函数只能从协程或其他挂起函数中调用。

您还应该考虑使用 Activity/Fragment 的 lifecycle scope 而不是 GlobalScope 以避免内存泄漏。

【讨论】:

以上是关于AsyncTask 从 Android R 中弃用。任何替代代码?的主要内容,如果未能解决你的问题,请参考以下文章

Parse.Promise 已从类型定义中弃用/删除?

如何在 API 29 中弃用 getExternalStorageDirectory 时读取或写入文件?

在 rails 3 中弃用 after_save 解决方案

thumbnailImageAtTime:timeOption 已弃用:首先在 iOS 7 中弃用

如何在 PHPDoc 中弃用 PHP 的魔法属性?

如何在 Xcode 中弃用方法