kotlin 用协程做网络请求_Android使用Kotlin协程封装网络库
概述
最近又要替換網(wǎng)絡(luò)庫成了,導(dǎo)致所有的業(yè)務(wù)代碼都要替換且要重新測(cè)試回歸。為了防止后續(xù)再遇到這樣事情,降低替換核心庫的成本,現(xiàn)利用協(xié)程對(duì)網(wǎng)絡(luò)庫進(jìn)行封裝。
理想API調(diào)用方式
launch {
val response = TestReq(q = "電腦").request()
Toast.makeText(this, response?.result?.toString()?:"網(wǎng)絡(luò)異常", Toast.LENGTH_SHORT).show()
}
請(qǐng)求定義
@URL("https://suggest.taobao.com/sug")
@GET
data class TestReq(var code: String = "utf-8", val q: String) : IReq
class TestResponse {
var result: List? = null
}
說明
launch是對(duì)Context的類擴(kuò)展,對(duì)于Activity而言可以在銷毀的時(shí)候關(guān)閉協(xié)程;其他場(chǎng)景可以自己管理協(xié)程。例如:
import kotlinx.coroutines.launch
class MainActivity : AppCompatActivity() , CoroutineScope by MainScope() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
launch {
val response = TestReq(q = "電腦").request()
Toast.makeText([email?protected], response?.result?.toString()?:"網(wǎng)絡(luò)異常", Toast.LENGTH_SHORT).show()
}
}
override fun onDestroy() {
super.onDestroy()
cancel()
}
}
使用
引用
implementation 'com.zhangzheng.easyhttp:library:1.0.1'
初始化
默認(rèn)(HttpUrlConnection)
EasyHttp.init(DefaultAdapter(GsonJsonParse()))
implementation 'com.google.code.gson:gson:2.8.6'
OkHttp
EasyHttp.init(OKHttpAdapter(GsonJsonParse()))
implementation 'com.squareup.okhttp3:okhttp:3.8.0'
implementation 'com.squareup.okio:okio:1.12.0'
implementation 'com.google.code.gson:gson:2.8.6'
Vollery
EasyHttp.init(VolleyAdapter(this,GsonJsonParse()))
implementation 'com.android.volley:volley:1.1.1'
implementation 'com.google.code.gson:gson:2.8.6'
如果使用的是FastJson可以替換解析器
GsonJsonParse() --> FastJsonParse()
implementation 'com.alibaba:fastjson:1.2.37'
如果協(xié)程不可用,檢查協(xié)程庫是否引入了
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.1"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1"
自定義擴(kuò)展
自己擴(kuò)展可以實(shí)現(xiàn)EasyHttp.IAdapter,對(duì)于后續(xù)替換網(wǎng)絡(luò)請(qǐng)求核心庫只需要開發(fā)適配器就可以了。對(duì)于json解析可以實(shí)現(xiàn)IResponseParse來擴(kuò)展。示例如下:
IAdapter
class OKHttpAdapter(var parse: IResponseParse) : EasyHttp.IAdapter {
override suspend fun request(url: String, params: Map, isGet: Boolean): String {
val okHttpClient = OkHttpClient()
val formBody = FormBody.Builder()
params.forEach {
formBody.add(it.key,it.value)
}
val request: Request =if(isGet){
Request.Builder().url(url.urlWithParam(params)).method("GET", null)
}else{
Request.Builder().url(url).method("POST", createParamBody(params))
}.build()
val call: Call = okHttpClient.newCall(request)
return call.execute().body()?.string()?:""
}
override fun parse(value: String, clazz: Class)=parse.parse(value,clazz)
private fun createParamBody(params: Map):FormBody{
val formBody = FormBody.Builder()
params.forEach {
formBody.add(it.key,it.value)
}
return formBody.build()
}
}
IResponseParse
class FastJsonParse :IResponseParse{
override fun parse(value: String, clazz: Class)=JSON.parseObject(value,clazz)
}
github地址:
總結(jié)
以上是生活随笔為你收集整理的kotlin 用协程做网络请求_Android使用Kotlin协程封装网络库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云账本的LOGO是什么
- 下一篇: c#对象集合去重_C# List集合去重