带有状态信息的LiveData封装使用以及结合Retrofit网络请求的拓展

LiveData 和ViewModel 简介

LiveData 和ViewModel是官方JetPack组件重要组成部分。

  • ViewModel 当因系统配置发生改变导致 Activity 重建的时候(比如旋转屏幕,更改系统语言),能对 LiveData 进行正确的保存和恢复(当然这要配合 LiveData)。当然如果是系统资源紧张被清除是不能恢复的。

  • LiveData 的作用是在使得数据能具有生命周期感知能力,在 Activity 等变为活跃状态的时候,自动回调观察者中的回调方法,也就是说对数据的变化进行实时监听。这样就不会出现异步请求数据成功后UI不活跃的时候出现空指针异常,也可以很好的避免内存泄露


    image.png

但是onChange 观察回调官方只是处理成功数据的回调,我们需要封装StateLiveData处理网络错误,服务器自定义的一些返回码等情况。

源码请点击:StateLiveData

        //LiveData 具有生命周期感知能力,它会自动对这些进行管理
        //UI 组件只需要对相关的数据进行监听,不需要关心是否应该暂停或者恢复监听。 
        blogViewModel.getAllBlog().observe(this, stateData -> {
            switch (stateData.getStatus()) {
                case SUCCESS:
                    disposeSuccessData(stateData.getData());
                    break;
                case ERROR:
                    //全局统一的错误处理,http 提示和UI 空页面,错误页面提示等. 静默请求是不需要的
                    BaseDispose.errorDispose(mBaseLoadService, getActivity(), stateData.getMsg(), stateData.getCode());
                    break;
            }
        });

这样子我们就知道在网络请求的时候的Loading,Error,Success 等状态了,封装后使用也很简单

    public StateLiveData getStateLiveData() {
        //1.异步加载网络请求数据
        newsApiService.getNews()
                .compose(SwitchSchedulers.applyScheduler2())//rxjava 切换线程
                .subscribe(new HttpObserver() {
                    @Override
                    public void onSuccess(NewsResult newsResult) {
                        stateLiveData.postSuccess(newsResult);
                    }

                    @Override
                    public void onFailure(int code, String message) {
                        super.onFailure(code, message);
                        //把错误信息告知给UI操作层面,好全局处理
                        stateLiveData.postFailure(message + code);
                    }
                });
        return stateLiveData;
    }

完整Demo: https://github.com/AnyLifeZLB/MVP-Dagger2-Rxjava2

StateLiveData 和Retrofit 结合使用的拓展(no rxjava)

怎么兼容以前的用法,可以自由的切换呢?尝试了一下好像是可以同时设置RxJava2CallAdapterFactory和LiveDataCallAdapterFactory 的。至于拓展,大神们自己来操刀吧

            retrofit = new Retrofit.Builder()
                    .baseUrl(baseUrl)       //Set the Api Base URL
                    .client(okHttpClient)   //The HTTP client used for requests.
                    .addConverterFactory(GsonConverterFactory.create())
                    //RxJava2CallAdapterFactory
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    //LiveData Call Factory
                    .addCallAdapterFactory(new LiveDataCallAdapterFactory())  //CallAdapter
                    .build();

请求的时候在NewsApiService.java 中定义不同返回就可以了

    @GET("today")
    Observable> getNews();


    /**
     * 直接返回LiveData
     */
    @GET("today")
    LiveData> getNewsLiveData();

Demo代码GitHub链接点这里

请选择组件化开发模式的module_news 调试

image.png

你可能感兴趣的:(带有状态信息的LiveData封装使用以及结合Retrofit网络请求的拓展)