LiveData :是一種持有可被觀察的類,和其他可被觀察的類不同的是,LiveData 是就要生命周期感覺能力的,這意味着他可以在 Activity ,fragment 或者 service 生命周期活躍狀态時 更新這些元件。
ViewModel:它是以一種關注生命周期的方式存儲和管理與 UI 相關的資料。當 螢幕旋轉時,活動會重新建立,onCreate方法被重新調用,但是我們可以使用 Bundle 恢複資料,但是這種方法隻适用于進行序列化的少量資料,不适合大量資料, 使用ViewModel 會自動保留 之前的資料并給行的 Activity 或者 Fragment 使用。知道 Activity 銷毀時 ,Framework 會調用 ViewModel 的 onCleared 方法,我們可以在 onCleared 方法中 做一些 資源清理工作
使用方式
1,導入依賴
implementation "android.arch.lifecycle:viewmodel:1.1.1"
implementation "android.arch.lifecycle:livedata:1.1.1"
2,這裡我們以一種最簡單的方式來示範它,建立 UserViewModel 類 繼承自 ViewModel。
public class UserViewModel extends ViewModel {
MutableLiveData<String> mutableLiveData;
public MutableLiveData<String> getStr(){
if (mutableLiveData == null){
mutableLiveData = new MutableLiveData<>();
}
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 3; i++) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mutableLiveData.postValue("哈哈");
}
}
}).start();
return mutableLiveData;
}
}
我們使用 MutableLiveData 來儲存資料,泛型為資料的類型,在 getStr 方法中,建立了一個線程,然後 通過 MutableLiveData 将資料發送出去,子線程使用postValue,主線程使用 setValue,最後将 MutableLiveData 傳回即可。
3,接下來在 Activity 中使用即可
public class MainActivity extends AppCompatActivity {
private UserViewModel model;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
model = new ViewModelProvider.NewInstanceFactory().create(UserViewModel.class);
model.getStr().observe(this, new Observer<String>() {
@Override
public void onChanged(String s) {
Log.e("哈哈哈", "onChanged: ");
}
});
}
}
通過上面的方式 即可 拿到資料,
4,如果需要多次擷取資料呢,例如界面需要重新整理等…
如下所示:
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (model != null) {
model.getStr();
}
}
});
如果點選了按鈕,則就會重新擷取一次資料,對應的監聽也會繼續執行一次。