天天看点

安卓笔记-想用骚操作封装网络请求(Retrofit+Rxjava)

就是突然想用一些骚操作来封装重复的操作,如果有更好(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)
        },{
            ...
        })
           

以上就是我想出来的三个网络请求封装的骚操作了。