天天看点

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

如果点击了按钮,则就会重新获取一次数据,对应的监听也会继续执行一次。