就是突然想用一些骚操作来封装重复的操作,如果有更好(Sao)的做法麻烦评论一起交流一下。
注意:以下我对retrofit的调用是用了我自己封装的retrofit,详细代码可以翻我之前的文章
骚操作一:
这个做法是目前我一直在用的,可以在我之前发的封装ViewModel的文章里看到完整代码
inline fun <T> request(observable : Observable<T> , crossinline callBack : (T) -> Unit) {
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Observer<T> {
override fun onComplete() {
isRequest.value = false
}
override fun onSubscribe(d: Disposable) {
disposables.add(d)
isRequest.value = true
}
override fun onNext(t: T) {
callBack.invoke(t)
}
override fun onError(e: Throwable) {
Log.e("netError",e.message)
isRequest.value = false
msg.value = BaseData(500, "网络请求错误,请重试")
}
})
}
调用(以登录接口为例子)
request(RetrofitFactory.createRequest(PostLoginRequest::class.java).login(account = account,password = pass)) {
.....
}
骚操作二:
先上代码
inline fun <T> Observable<T>.request(viewModel : BaseViewModel? = null,crossinline onSuccess : ((data : T) -> Unit)) {
this.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Observer<T> {
override fun onComplete() {
viewModel?.endRequest()
}
override fun onSubscribe(d: Disposable) {
viewModel?.startRequest(d)
}
override fun onNext(t: T) {
onSuccess.invoke(t)
}
override fun onError(e: Throwable) {
viewModel?.errorData(e)
}
})
}
这使用了kotlin的扩展函数,另外传入的viewModel是我自己定义的一个对viewModel的封装类,如果没需要可以不传,如果要复制这个代码的话可以去掉这个参数。
调用:
RetrofitFactory.createRequest(PostLoginRequest::class.java).login(account = account,password = pass).request(this){
...
}
这里传this是因为我这段代码是写在viewModel里的。
骚操作三:
写一个全局函数,顺便把创建service实例的步骤也一并做了,代码如下
inline fun <T,R> startNetRequest(observableClass : Class<R>,viewModel : BaseViewModel? = null,crossinline onStart:(observable : R) -> Observable<T>,crossinline onSuccess : ((data : T) -> Unit)) {
onStart.invoke(RetrofitFactory.createRequest(observableClass)).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Observer<T> {
override fun onComplete() {
viewModel?.endRequest()
}
override fun onSubscribe(d: Disposable) {
viewModel?.startRequest(d)
}
override fun onNext(t: T) {
onSuccess.invoke(t)
}
override fun onError(e: Throwable) {
viewModel?.errorData(e)
}
})
}
因为service实例声明出来后里面是啥方法是不知道的,所以这一步还得在调用的时候让开发者走一下
调用:
startNetRequest(PostLoginRequest::class.java,this,{
it.login(account = account,password = pass)
},{
...
})
以上就是我想出来的三个网络请求封装的骚操作了。