Android网络请求
对于Android的网络请求有很多种用法,本文讨论的是kotlin协程+Retrofit2进行网络请求的处理。
通过阅读Retrofit的官方文档可以知道,首先我们需要定义service的接口,即请求的方式,参数,以及返回值。需要对方法使用suspend关键词进行包装,这里使用suspend关键词包装的原因是我们会在viewmodel中使用协程进行访问api的操作。
1 | suspend fun getUserProfile(): UserProfile |
接下来我们需要构建Retrofit对象,使用官方推荐的okhttp client,定义相关的配置以及拦截器,这里推
荐使用单例模式构建Retrofit对象。例如:
1 | val clientBuilder = OkHttpClient.Builder().connectTimeout(30, TimeUnit.SECONDS) |
由于项目中将所有网络请求操作放在了viewmodel层进行,所以我们需要在viewmodel中使用viewModelScope.launch{}的方式来在viewmodel的scope中启动协程进行网络请求。这种方式可以避免使用callback的方式来处理请求结果,但是在错误处理方面比较弱,只能通过try,catch包裹来处理异常:
1 | try { |
针对不同的error进行处理的时候可以考虑使用retrofit的Call对象,在定义的接口的时候如下:
1 | fun getYachtById(Long) yachtId: : Call<YachtDetail> |
在调用接口处的地方可以传入callback进行处理:
1 | ApiService.getInstance().getYachtById(yachtId).enqueue(object :Callback<YachtDetail>{ |