天天看點

Android JitPack 之 LiveData 和 ViewModel

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();
                }
            }
        });
           

如果點選了按鈕,則就會重新擷取一次資料,對應的監聽也會繼續執行一次。