安卓开发优秀案例

安卓AsyncTask发送单个或多个网络请求(串行)

2020-05-12  本文已影响0人  蓝不蓝编程

目标

采用AsyncTask,发送单个或多个网络请求(串行),并更新UI.

实现方案

发送单个网络请求方案

  1. 修改app工程的build.gradle文件
compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}
implementation "com.google.code.gson:gson:2.8.5"
  1. 定义数据类Task.kt
data class Task(val id: Int, var name: String)
  1. 创建网络工具类NetworkUtils.kt
fun getInfoByUrl(url: URL): String {
    var str = ""
    runCatching {
        val connection = url.openConnection() as HttpURLConnection
        connection.requestMethod = "GET"
        connection.readTimeout = 5000
        connection.connectTimeout = 5000
        if (connection.responseCode == 200) {
            val inputStream = connection.inputStream
            str = streamToString(inputStream)
        }
    }
    return str
}

fun streamToString(inputStream: InputStream): String {
    val builder = StringBuilder()
    val reader = BufferedReader(InputStreamReader(inputStream))
    var con: String?
    runCatching {
        while (reader.readLine().also { con = it } != null) {
            builder.append(con)
        }
        reader.close()
    }
    return builder.toString()
}
  1. activity调用
private fun queryData() {
    AsyncTask1().execute()
}

internal inner class AsyncTask1 :
    AsyncTask<String?, Void?, String>() {
    override fun onPreExecute() {
        super.onPreExecute()
    }

    override fun onPostExecute(info: String) {
        super.onPostExecute(info)
        val (id, name) = Gson().fromJson(info, Task::class.java)
        contentTv.text = name
    }

    override fun doInBackground(vararg params: String?): String {
        val url = "https://gitee.com/cxyzy1/AndroidAsyncTaskDemo/raw/master/data.json"
        return getInfoByUrl(URL(url))
    }
}

发送两个网络请求方案

  1. 修改app工程的build.gradle文件,同上
  2. 定义数据类Task.kt,同上
  3. 创建网络工具类NetworkUtils.kt,同上
  4. activity调用
private fun queryData() {
    AsyncTask1().execute()
}

internal inner class AsyncTask1 :
    AsyncTask<String?, Void?, String>() {
    override fun onPreExecute() {
        super.onPreExecute()
    }

    override fun onPostExecute(info: String) {
        super.onPostExecute(info)
        val (id, name) = Gson().fromJson(info, Task::class.java)
        contentTv.text = name
        queryData2()
    }

    override fun doInBackground(vararg params: String?): String {
        val url = "https://gitee.com/cxyzy1/AndroidAsyncTaskDemo/raw/master/data.json"
        return getInfoByUrl(URL(url))
    }
}

private fun queryData2() {
    AsyncTask2().execute()
}

internal inner class AsyncTask2 :
    AsyncTask<String?, Void?, String>() {
    override fun onPreExecute() {
        super.onPreExecute()
    }

    override fun onPostExecute(info: String) {
        super.onPostExecute(info)
        val (id, name) = Gson().fromJson(info, Task::class.java)
        contentTv2.text = name
    }

    override fun doInBackground(vararg params: String?): String {
        val url = "https://gitee.com/cxyzy1/AndroidAsyncTaskDemo/raw/master/data2.json"
        return getInfoByUrl(URL(url))
    }
}

代码说明:
queryData方法访问第一个网络接口,在获得返回结果后,再通过queryData2访问第二个接口.

完整源代码

https://gitee.com/cxyzy1/AndroidAsyncTaskDemo/tree/master/asyncTaskDemo

上一篇下一篇

猜你喜欢

热点阅读