Android使用Kotlin协程封装网络库

概述

         最近又要替换网络库成了,导致所有的业务代码都要替换且要重新测试回归。为了防止后续再遇到这样事情,降低替换核心库的成本,现利用协程对网络库进行封装。

 

理想API调用方式

     launch {
val response = TestReq(q = "电脑").request<TestResponse>()
Toast.makeText(this, response?.result?.toString()?:"网络异常", Toast.LENGTH_SHORT).show()
}

请求定义

@URL("https://suggest.taobao.com/sug")
@GET
data class TestReq(var code: String = "utf-8", val q: String) : IReq

class TestResponse {
var result: List<Any>? = null
}

说明

    launch是对Context的类扩展,对于Activity而言可以在销毁的时候关闭协程;其他场景可以自己管理协程。例如:

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<TestResponse>()
Toast.makeText(this@MainActivity, response?.result?.toString()?:"网络异常", Toast.LENGTH_SHORT).show()
}
}

override fun onDestroy() {
super.onDestroy()
cancel()
}

}

 

使用
引用

  implementation 'com.zhangzheng.easyhttp:library:1.0.1'
初始化

默认(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' 

如果协程不可用,检查协程库是否引入了

 implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.1"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1"

 

自定义扩展

        自己扩展可以实现EasyHttp.IAdapter,对于后续替换网络请求核心库只需要开发适配器就可以了。对于json解析可以实现IResponseParse来扩展。示例如下:

 

IAdapter

class OKHttpAdapter(var parse: IResponseParse) : EasyHttp.IAdapter {
override suspend fun request(url: String, params: Map<String, String>, 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 <T> parse(value: String, clazz: Class<T>)=parse.parse(value,clazz)

private fun createParamBody(params: Map<String, String>):FormBody{
val formBody = FormBody.Builder()
params.forEach {
formBody.add(it.key,it.value)
}
return formBody.build()
}
}

 

IResponseParse

class FastJsonParse :IResponseParse{

override fun <T > parse(value: String, clazz: Class<T>)=JSON.parseObject(value,clazz)

}

 

github地址:https://github.com/long8313002/EasyHttp

原创:https://www.panoramacn.com
源码网提供WordPress源码,帝国CMS源码discuz源码,微信小程序,小说源码,杰奇源码,thinkphp源码,ecshop模板源码,微擎模板源码,dede源码,织梦源码等。

专业搭建小说网站,小说程序,杰奇系列,微信小说系列,app系列小说

Android使用Kotlin协程封装网络库

免责声明,若由于商用引起版权纠纷,一切责任均由使用者承担。

您必须遵守我们的协议,如果您下载了该资源行为将被视为对《免责声明》全部内容的认可-> 联系客服 投诉资源
www.panoramacn.com资源全部来自互联网收集,仅供用于学习和交流,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。 敬请谅解! 侵权删帖/违法举报/投稿等事物联系邮箱:2640602276@qq.com
未经允许不得转载:书荒源码源码网每日更新网站源码模板! » Android使用Kotlin协程封装网络库
关注我们小说电影免费看
关注我们,获取更多的全网素材资源,有趣有料!
120000+人已关注
分享到:
赞(0) 打赏

评论抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

您的打赏就是我分享的动力!

支付宝扫一扫打赏

微信扫一扫打赏