LiveData+ViewModel+Repository搭建MVVM

什麼是LiveData

LiveData is an observable data holder class. Unlike a regular observable, LiveData is lifecycle-aware, meaning it respects the lifecycle of other app components, such as activities, fragments, or services. This awareness ensures LiveData only updates app component observers that are in an active lifecycle state. Source:developer.android.com/topic/libra…html

什麼是ViewModel

The ViewModel class is designed to store and manage UI-related data in a lifecycle conscious way. The ViewModel class allows data to survive configuration changes such as screen rotations. Source:developer.android.com/topic/libra…java

ViewModel的生命週期

ViewModel的生命週期

寫個Demo

引入依賴庫

implementation "android.arch.lifecycle:extensions:1.1.1"android

extensions庫中包含的內容以下:git

extensions庫內容

總體架構

MVVM

步驟

建立Model,定義數據結構

public class MainBean {

    public DataBean data;

    public static class DataBean {
        public String name;
    }

}
複製代碼

建立Repository,獲取數據並暴露接口給ViewModel

public MutableLiveData<MainBean> getData(int id) {
    //構造須要暴露的數據結構
    final MutableLiveData<MainBean> liveData = new MutableLiveData<>();
    //獲取數據
    MainApiService mainApiService = retrofit.create(MainApiService.class);
    Call<MainBean> call = mainApiService.getData(id);
    call.enqueue(new Callback<MainBean>() {
        @Override
        public void onResponse(Call<MainBean> call, Response<MainBean> response) {
            //設置數據
            if (response.isSuccessful()) {
                liveData.setValue(response.body());
            } else {
                liveData.setValue(null);
            }
        }

        @Override
        public void onFailure(Call<MainBean> call, Throwable t) {
            liveData.setValue(null);
        }
    });
    //返回數據
    return liveData;
}
複製代碼

建立ViewModel,編寫View層真正須要的接口

若是View層須要直接操做MainBean,能夠這樣處理:github

public LiveData<MainBean> getData() {
    return mainRepository.getData();
}
複製代碼

若是View層只須要name字段,用於顯示名字,能夠這樣處理:數據結構

public LiveData<String> getData() {
    int id = 1;
    final MutableLiveData<MainBean> liveData = mainRepository.getData(id);
    //執行數據轉換操做並得到轉換後的數據
    LiveData<String> newLiveData = Transformations.switchMap(liveData, new Function<MainBean, LiveData<String>>() {
        @Override
        public LiveData<String> apply(MainBean mainBean) {
            final MutableLiveData<String> newLiveData = new MutableLiveData<>();
            if (mainBean == null || mainBean.data == null) {
                newLiveData.setValue(null);
            } else {
                newLiveData.setValue(mainBean.data.name);
            }
            return newLiveData;
        }
    });
    //返回轉換後的數據
    return newLiveData;
}
複製代碼

建立View層,僅執行UI顯示邏輯,不可執行數據處理邏輯

mainViewModel.getData().observe(this, new Observer<String>() {
    @Override
    public void onChanged(@Nullable String s) {
        mainFragmentText.setText(s);
    }
});
複製代碼

完整代碼,請看Github

什麼是LifeCycle

上面的LiveData組件的核心實際上就是Lifecycle,好比咱們想要監聽Acitivity等組件的生命週期,就可使用該類實現,下面介紹一下如何使用:架構

首先使Activity等組件實現LifecycleRegistryOwner(這個類實際上已通過時了,可是我仍實現他是由於實現LifecycleOwner在Fragment中會出現沒法監聽生命週期的問題)

public class LifecycleActivity extends FragmentActivity implements LifecycleRegistryOwner {

    private LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this);

    @NonNull
    @Override
    public LifecycleRegistry getLifecycle() {
        return lifecycleRegistry;
    }
}
複製代碼

建立LifecycleObserver類,監聽生命週期變化

public class ActivityLifecycleObserver implements LifecycleObserver {

    private static final String TAG = "ActivityObserver";

    private Context context;

    public ActivityLifecycleObserver(Context context) {
        this.context = context;
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void onCreate() {
        Log.d(TAG, "onCreate");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void onStart() {
        Log.d(TAG, "onStart");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void onResume() {
        Log.d(TAG, "onResume");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void onPause() {
        Log.d(TAG, "onPause");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void onStop() {
        Log.d(TAG, "onStop");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void onDestroy() {
        Log.d(TAG, "onDestroy");
    }

    //任意回調都會調用它,好比調用完onCreate()後會回調這裏的onCreate(),而後會回調onAny();
    @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
    public void onAny() {
        Log.d(TAG, "onAny");
    }

}
複製代碼

註冊

getLifecycle().addObserver(new ActivityLifecycleObserver(getApplicationContext()));
複製代碼

LifeCycle目前只寫到這裏,尚未繼續深刻,繼續努力中...app

參考文章

相關文章
相關標籤/搜索