帶有狀態(tài)信息的LiveData封裝使用以及結(jié)合Retrofit網(wǎng)絡(luò)請(qǐng)求的拓展

LiveData 和ViewModel 簡(jiǎn)介

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

  • ViewModel 當(dāng)因系統(tǒng)配置發(fā)生改變導(dǎo)致 Activity 重建的時(shí)候(比如旋轉(zhuǎn)屏幕,更改系統(tǒng)語言),能對(duì) LiveData 進(jìn)行正確的保存和恢復(fù)(當(dāng)然這要配合 LiveData)。當(dāng)然如果是系統(tǒng)資源緊張被清除是不能恢復(fù)的。

  • LiveData 的作用是在使得數(shù)據(jù)能具有生命周期感知能力,在 Activity 等變?yōu)榛钴S狀態(tài)的時(shí)候,自動(dòng)回調(diào)觀察者中的回調(diào)方法,也就是說對(duì)數(shù)據(jù)的變化進(jìn)行實(shí)時(shí)監(jiān)聽。這樣就不會(huì)出現(xiàn)異步請(qǐng)求數(shù)據(jù)成功后UI不活躍的時(shí)候出現(xiàn)空指針異常,也可以很好的避免內(nèi)存泄露


    image.png

但是onChange 觀察回調(diào)官方只是處理成功數(shù)據(jù)的回調(diào),我們需要封裝StateLiveData處理網(wǎng)絡(luò)錯(cuò)誤,服務(wù)器自定義的一些返回碼等情況。

源碼請(qǐng)點(diǎn)擊:StateLiveData

        //LiveData 具有生命周期感知能力,它會(huì)自動(dòng)對(duì)這些進(jìn)行管理
        //UI 組件只需要對(duì)相關(guān)的數(shù)據(jù)進(jìn)行監(jiān)聽,不需要關(guān)心是否應(yīng)該暫?;蛘呋謴?fù)監(jiān)聽。 
        blogViewModel.getAllBlog().observe(this, stateData -> {
            switch (stateData.getStatus()) {
                case SUCCESS:
                    disposeSuccessData(stateData.getData());
                    break;
                case ERROR:
                    //全局統(tǒng)一的錯(cuò)誤處理,http 提示和UI 空頁面,錯(cuò)誤頁面提示等. 靜默請(qǐng)求是不需要的
                    BaseDispose.errorDispose(mBaseLoadService, getActivity(), stateData.getMsg(), stateData.getCode());
                    break;
            }
        });

這樣子我們就知道在網(wǎng)絡(luò)請(qǐng)求的時(shí)候的Loading,Error,Success 等狀態(tài)了,封裝后使用也很簡(jiǎn)單

    public StateLiveData<HotNewsResult> getStateLiveData() {
        //1.異步加載網(wǎng)絡(luò)請(qǐng)求數(shù)據(jù)
        newsApiService.getNews()
                .compose(SwitchSchedulers.applyScheduler2())//rxjava 切換線程
                .subscribe(new HttpObserver<NewsResult>() {
                    @Override
                    public void onSuccess(NewsResult newsResult) {
                        stateLiveData.postSuccess(newsResult);
                    }

                    @Override
                    public void onFailure(int code, String message) {
                        super.onFailure(code, message);
                        //把錯(cuò)誤信息告知給UI操作層面,好全局處理
                        stateLiveData.postFailure(message + code);
                    }
                });
        return stateLiveData;
    }

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

StateLiveData 和Retrofit 結(jié)合使用的拓展(no rxjava)

怎么兼容以前的用法,可以自由的切換呢?嘗試了一下好像是可以同時(shí)設(shè)置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();

請(qǐng)求的時(shí)候在NewsApiService.java 中定義不同返回就可以了

    @GET("today")
    Observable<NewsHttpResponse<HotNewsResult>> getNews();


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

Demo代碼GitHub鏈接點(diǎn)這里

請(qǐng)選擇組件化開發(fā)模式的module_news 調(diào)試

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容