美文网首页Android-Jetpack
超级简单的 LiveData 示例

超级简单的 LiveData 示例

作者: 宝塔山上的猫 | 来源:发表于2019-06-28 20:30 被阅读4次

    demo网站 https://github.com/liaozhoubei/Android_Example

    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 之后就不在打印日志,重回界面又出现了!

    相关文章

      网友评论

        本文标题:超级简单的 LiveData 示例

        本文链接:https://www.haomeiwen.com/subject/bqqycctx.html