注意:没有学习过DSL 以及 协程(此次实践将会使用) 的可以阅读以下两篇
"retrofit" : "com.squareup.retrofit2:retrofit:$retrofit_version",
"retrofit-converter-gson" : "com.squareup.retrofit2:converter-gson:${retrofit_version}",
"retrofit-adapter-rxjava2" : "com.squareup.retrofit2:adapter-rxjava2:${retrofit_version}",
"okhttp3" : "com.squareup.okhttp3:okhttp:${okhttp_version}",
"okhttp3-logging-interceptor": "com.squareup.okhttp3:logging-interceptor:${okhttp_version}",
"rxkotlin" : "io.reactivex.rxjava2:rxkotlin:$rx_kotlin_version",
"rxandroid" : "io.reactivex.rxjava2:rxandroid:$rx_android_version",
class RetrofitFactory private constructor() {
private val retrofit : Retrofit
fun create(clazz: Class) : T {
return retrofit.create(clazz)
}
init {
retrofit = Retrofit.Builder()
.baseUrl(Constant.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(initOkHttpClient())
.build()
}
companion object {
val instance by lazy {
RetrofitFactory()
}
}
private fun initOkHttpClient(): OkHttpClient {
return OkHttpClient.Builder()
.addInterceptor() // 添加自定义拦截器
.connectTimeout(30, TimeUnit.SECONDS) // 请求超时时间
.writeTimeout(30, TimeUnit.SECONDS) // 写入超时时间
.readTimeout(30, TimeUnit.SECONDS) // 读取超时时间
.build()
}
}
/** @GET GET请求方式
@POST POST请求方式
@Query GET请求参数
@Header用来添加Header请求头
@FormUrlEncoded post请求头标示
其他注解请求方式:
@PUT 表示这是一个PUT请求
@DELETE 表示这是一个DELETE请求
@HEAD 表示这是一个HEAD请求
@OPTIONS 表示这是一个OPTION请求
@PATCH 表示这是一个PAT请求
**/
interface ApiService {
@GET("/banner/json")
fun loadBanner(): Observable>>
}
class HomeRepository (loadState : MutableLiveData) : ArticleRepository(loadState) {
fun loadBanner(liveData: MutableLiveData>>) {
apiService.loadBanner()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
BaseObserver(
liveData,
loadState,
this
)
)
}
}
class HomeViewModel(application: Application) :
ArticleViewModel(application) {
val mBannerData: MutableLiveData>> = MutableLiveData()
fun loadBanner() {
mRepository.loadBanner(mBannerData)
}
}
// 使用suspend函数修饰
@GET("/banner/json")
suspend fun loadBannerCo() : BaseResponse>
fun BaseResponse.dataConvert(
loadState: MutableLiveData
) : T{
when (errorCode) {
...
}
}
// 没有使用LiveData的postValue将数据传出,所以采用返回值的形式返回数据
suspend fun loadBannerCo() : List {
return apiService.loadBannerCo().dataConvert(loadState)
}
// 作为返回值的接收值,在Activity或者Fragment中观察该值即可
var mBannerData: MutableLiveData> =
MutableLiveData()
fun loadBannerCo() {
// 开启协程
viewModelScope.launch {
try{
// 切换IO线程做数据请求
val data = withContext(Dispatchers.IO) {
mRepository.loadBannerCo()
}
// 设置LiveData即可
mBannerData.value = data
} catch (e : Exception) {
e.printStackTrace()
}
}
}