Android中使用协程进行Http异步请求的简单实例。
Gradle配置
dependencies {
implementation 'com.squareup.okhttp3:okhttp:4.1.0'
implementation 'com.eclipsesource.minimal-json:minimal-json:0.9.5'
def coroutines_version = '1.3.0'
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version"
}
HTTP通信
class HttpUtil {
fun httpGET1(url : String): String? {
val client = OkHttpClient()
val request = Request.Builder()
.url(url)
.build()
val response = client.newCall(request).execute()
val body = response.body?.string()
return body
}
}
UI更新
class MainActivity : AppCompatActivity() {
val URL = " 省略 "
var result = ""
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val getButton = findViewById(R.id.button) as Button
getButton.setOnClickListener(object : View.OnClickListener {
override
fun onClick(view: View) {
onParallelGetButtonClick()
}
})
}
//HTTP GET
fun onParallelGetButtonClick() = GlobalScope.launch(Dispatchers.Main) {
val http = HttpUtil()
//不能在UI线程进行请求,使用async起到后台线程,使用await获取结果
async(Dispatchers.Default) { http.httpGET1(URL) }.await()
.let {
val result = Json.parse(it).asObject() // json解析
val textView = findViewById(R.id.text) as TextView
textView.setText(result.get("description").asObject().get("text").asString())
}
}