Android R中已弃用AsyncTask。有其他代码吗?

Android R中已弃用AsyncTask。有其他代码吗?,android,android-studio,kotlin,android-asynctask,Android,Android Studio,Kotlin,Android Asynctask,由于Android R不推荐使用AsyncTask,因此我无法解析或接受来自web的JSON数据。所以我所做的是。我创建了一个名为DownloadingObject的kotlin类。下面是代码 类下载对象{ @Throws(IOException::class) fun downloadJSONDataFromLink(link: String): String { val stringBuilder: StringBuilder = StringBuilder() val u

由于Android R不推荐使用AsyncTask,因此我无法解析或接受来自web的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()
}
我必须在后台运行这个下载任务。下面是代码

内部类下载PlantTask:AsyncTask>(){

override-fun-doInBackground(vararg参数:String?):列表{
//可以访问后台线程。不能访问用户界面线程
val downloadingObject:downloadingObject=downloadingObject()
var jsonData=downloadingObject.downloadJSONDataFromLink(
"http://plantplaces.com/perl/mobile/flashcard.pl"
)
Log.i(“JSON”,jsonData)
返回空
}

如果有人能提供任何替代代码,请告诉我。我只是Android开发中的一个比基纳。

在Android上有几种实现多线程的方法。因为你使用Kotlin,你可能想研究一下。还有一些其他东西是包和,但在我看来,协同程序对初学者更友好,它们集成了它的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)
}
关键字表示此函数只能从协同程序或其他挂起函数调用


您也应该考虑使用活动/片段而不是全局范围来避免内存泄漏。

“我创建了一个名为DownloadingObject的KOTLIN类”——因为使用了异步请求选项(<代码> EnQueNe())/>代码>,所以使用OKHTTP会更简单。
@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)
}