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具有生命周期的网络请求的主要内容,如果未能解决你的问题,请参考以下文章

编写一个自己的库函数strcmp(),用来实现实现两个字符串的比较

测试中常用的python第三方库

前端库

爬虫第一篇基本库的使用——urllib

Python基础库及机器学习笔记

使用python wordcloud库实现词云,教你两招轻松搞定