liveDataCallAdapter库 用来实现Retrofit+LiveData具有生命周期的网络请求
Posted 雪の星空朝酱
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了liveDataCallAdapter库 用来实现Retrofit+LiveData具有生命周期的网络请求相关的知识,希望对你有一定的参考价值。
liveDataCallAdapter库 用来实现Retrofit+LiveData具有生命周期的网络请求
关于
因为最近在用java写一个模仿网易云音乐的博客教程,所以用到了retrofit+rxjava+okhttp3网络框架,因为项目是mvvm框架,所以难免会用到LiveData,它的优势如下:
所以也推荐用LiveData,使用rxjava也可以,就是要考虑一些内存泄漏等问题。
添加引用
liveDataCallAdapter
工程build:
allprojects
repositories
...
maven url 'https://jitpack.io'
项目build:
implementation 'com.github.Tobeyr1:liveDataCallAdapter:1.0.2'
使用 (支持Java/Kotlin)
将其添加到你的retrofit的build中:
Retrofit.Builder()
.client(client)
.baseUrl(Constant.BaseUrl)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addCallAdapterFactory(LiveDataCallAdapterFactory.create()) //add this line to you httpService
.addConverterFactory(GsonConverterFactory.create())
.build();
修改调用api的地方:
@GET("lyric") //获取歌词
LiveData<ApiResponse<xxxx>> getLyric(@Query("id") long songId);
//默认使用方法是LiveData<ApiResponse<xxx>>,其中xxx为你自己的实体类
然后在页面中使用:
viewModel.getLyric(1111111)
//lyricEntityApiResponse是根据你的实体类和lib中的apiResonse合成的
.observe(this, lyricEntityApiResponse ->
//可以通过提供的getStatus()方法来判断是返回成功了,还是失败 Status.SUCCESS Status.ERROR
//如果失败了,也可以通过getMessage()获取失败信息
//通过getData()获取实体类数据
if (lyricEntityApiResponse.getStatus() == Status.SUCCESS)
binding.lrc.loadLrc(lyricEntityApiResponse.getData().getLrc().getLyric(),lyricEntityApiResponse.getData().getTlyric().getLyric());
);
因为是livedata,所以我们可以在这里嵌套调用其他方法,比如请求b的参数基于请求a的结果,但是可以把耗时操作放到viewmodel里面。
相比较rxjava的调用方式:
viewModel.login()
.compose(RXHelper.observableIO2Main(this))
.subscribe(new Observer<LoginEntity>()
@Override
public void onSubscribe(Disposable d)
@Override
public void onNext(LoginEntity login_bean)
if (login_bean.getCode() == 200)
else
@Override
public void onError(Throwable e)
@Override
public void onComplete()
);
其中RXHelper.java代码如下:
public class RXHelper
public static <T> ObservableTransformer<T, T> observableIO2Main(final Context context)
return upstream ->
Observable<T> observable = upstream.subscribeOn(Schedulers.io())
.observeOn(androidSchedulers.mainThread());
return composeContext(context, observable);
;
public static <T> ObservableTransformer<T, T> observableIO2Main(final RxFragment fragment)
return upstream -> upstream.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()).compose(fragment.<T>bindToLifecycle());
public static <T> FlowableTransformer<T, T> flowableIO2Main()
return upstream -> upstream
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
private static <T> ObservableSource<T> composeContext(Context context, Observable<T> observable)
if(context instanceof RxActivity)
return observable.compose(((RxActivity) context).bindUntilEvent(ActivityEvent.DESTROY));
else if(context instanceof RxFragmentActivity)
return observable.compose(((RxFragmentActivity) context).bindUntilEvent(ActivityEvent.DESTROY));
else if(context instanceof RxAppCompatActivity)
return observable.compose(((RxAppCompatActivity) context).bindUntilEvent(ActivityEvent.DESTROY));
else
return observable;
以上是关于liveDataCallAdapter库 用来实现Retrofit+LiveData具有生命周期的网络请求的主要内容,如果未能解决你的问题,请参考以下文章