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

    技术2022-07-11  104

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

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

    Processed: 0.021, SQL: 9