}
/**
- 在IO线程中执行一个协程
*/
protected fun launchOnIO(block: suspend CoroutineScope.() -> Unit): Job {
return viewModelScope.launch(Dispatchers.IO) { block() }
}
}
二、与Retrofit的结合
目前在Android开发中,最主流的网络请求框架应该就是Retrofit+OkHttp+RxJava
这一套了。那么下面我们就使用Retrofit
来结合协程进行封装。在网络请求中,协程起的作用其实与RxJava
是一致的,所以如果在别处没有使用RxJava
的需求,此处可以不引入RxJava
,只需引入Retrofit+OkHttp
。
Interface
interface FlyInterface {
/**
- 获取文章列表
*/
@GET(“article/”)
suspend fun get_article_list(@Query(“page_size”) size: Int): ApiResponse<CommonListDto>
}
interface
的改造非常简单,仅仅是在函数前加上suspend
修饰。
ApiResponse
abstract class HttpResponse(val code: Int, val msg: String, val data: T?) {
abstract fun isSuccess(): Boolean
}
class ApiResponse(code: Int, msg: String, data: T?) : HttpResponse(code, msg, data) {
override fun isSuccess(): Boolean {
return code == 0
}
}
ApiResponse
是上述interface
中函数的返回值,实现也非常简单。因为接口返回的数据格式一般都是统一的,例如:
{
“code”: 0;
“message”: “Success”;
“data”: {
…
}
}
所以,我们也需要将返回的数据格式用一个统一的数据模型来处理。
HttpError
我们可以事先定义一些事先常见的网络错误,方便后续使用。
enum class HttpError(val code: Int, @StringRes val message: Int) {
// 未知错误
UNKNOWN(-1, R.string.fly_http_error_unknow),
// 网络连接错误
CONNECT_ERROR(-2, R.string.fly_http_error_connect),
// 连接超时
CONNECT_TIMEOUT(-3, R.string.fly_http_error_connect_timeout),
// 错误的请求
BAD_NETWORK(-4, R.string.fly_http_error_bad_network),
// 数据解析错误
PARSE_ERROR(-5, R.string.fly_http_error_parse),
// 取消请求
CANCEL_REQUEST(-6, R.string.fly_http_cancel_request),
}
Retrofit
相信大部分同学在使用Retrofit时都会自己做二次封装的,此处就不附上详细的代码了,主