AsyncTask从Android R中被废弃,有替代代码吗?

问题描述 投票:1回答:1

由于Android R不支持AsyncTask,我无法解析或接受来自Web的JSON数据。http:/plantplaces.comperlmobileflashcard.pl。. 所以,我所做的是。我创建了一个名为DownloadingObject的kotlin类。下面是代码

类 DownloadingObject {

@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开发的新手。

android android-studio kotlin android-asynctask
1个回答
1
投票

有几种方法可以在Android上实现多线程。既然你使用的是Kotlin,你可能会想了解一下 Kotlin Coroutines. 还有一些其他的东西在那里是 java.concurrent.* 包和 RxJava但在我看来,Coroutines更适合初学者,而且它们与Android组件集成得非常好。

使用coroutines,你的代码会是这样的。

@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)
}

The 吊销 关键字意味着这个函数只能从一个coroutine或另一个暂停函数中调用。

同时你应该考虑使用ActivityFragment的 生命周期范围 而不是GlobalScope,以避免内存泄漏。

© www.soinside.com 2019 - 2024. All rights reserved.