LiveData 是android 新出的 jetpack 系列库的一个库。它的用处就是感知相关 Activity 的生命周期,当应用处于 onStart-onPause 之间时,就会正常传递数据,如果不是则中止传递数据。说实在话,LiveData 给我的感觉类似于一个包装类,被其
具体的说明大家就自己上网看一下吧。
但是 LiveData 需要与 ViewModel 合起来使用。
添加依赖
LiveData 是 jetPack 出的 lifecycle 库的一部分,因此需要导入 lifecycle 库。
在 modle 中的 build.gradle 的 dependencies 中添加依赖,这里简单的在 app 模块下添加,如下:
dependencies {
implementation "android.arch.lifecycle:runtime:1.1.1"
implementation "android.arch.lifecycle:extensions:1.1.1"
annotationProcessor "android.arch.lifecycle:compiler:1.1.1"
}
使用
我们假设一个业务场景:有个定时任务会每隔一段时间发送通知更新 UI 。
一般来说更新 UI 时我们只需要判断当前 activity 或 fragment 是否销毁就行,严格一点的还要判断是否在可见状态。
如果自己判断的话会有点麻烦,简单一点的就写个 boolean 检测,麻烦一点就写个接口进行回调。
但是现在 lifecycle 已经帮我们处理好,使用 liveData 包装数据会只在界面可见状态下才传递,避免了那种界面不可见或者销毁状态下的内存泄漏的问题。
ViewModel 的使用
MutableLiveData 是 LiveData 的子类,添加了公共方法 setValue 和 postValue ,方便开发者直接使用。 setValue 必须在主线程调用。 postValue 可以在后台线程中调用。
在这里用线程模拟一个定时任务,每隔 2s 中更新一次数据发送出去修改 UI ,发送的数据就是 MutableLiveData<Long> 对象,实质上 MutableLiveData 是个泛型,它将要发送的数据包装起来,通过调用 postValue 发送出去
代码如下:
public class LiveDataTestModel extends ViewModel {
private static final int ONE_SECOND = 1000;
//新建一个LiveData实例
private MutableLiveData<Long> mElapsedTime = new MutableLiveData<>();
private long mInitialTime;
public LiveDataTestModel() {
new Thread(new Runnable() {
@Override
public void run() {
while (true){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
final long newValue =
(SystemClock.elapsedRealtime() - mInitialTime) / 1000;
mElapsedTime.postValue(newValue);
}
}
}).start();
}
public MutableLiveData<Long> getmElapsedTime() {
return mElapsedTime;
}
}
数据接收
数据接收也很简单,在需要接收数据的地方获取到 MutableLiveData 对象,然后设置回调监听就完事了,代码如下:
public class LiveDataActivity extends AppCompatActivity {
TextView mTvLivedata = (TextView) findViewById(R.id.tv_livedata);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_live_data);
LiveDataTestModel liveDataTestModel = ViewModelProviders.of(this).get(LiveDataTestModel.class);
liveDataTestModel.getmElapsedTime().observe(this, new Observer<Long>() {
@Override
public void onChanged(@Nullable Long aLong) {
mTvLivedata.setText(aLong + "");
Log.d("LiveDataActivity", "Updating timer");
}
});
}
}
然后再运行的时候,你会发现在可见状态下会打印 log ,然后进入 onPause 之后就不在打印日志,重回界面又出现了!
网友评论