Lifecycle LiveData 与 ViewModel

作者: 金馆长说 | 来源:发表于2018-08-23 17:35 被阅读45次

    Lifecycle使用

    它是Google官方发布的一个处理Activity和Fragment声明周期的框架,之前我们处理生命周期都是在类里面做处理。如下这种方式本身是没有任何问题的,但是如果类或者逻辑一多,这种处理声明周期的逻辑就会很多了。

     @Override
        protected void onStart() {
            super.onStart();
           //处理onStart
          p层.xx
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            //处理onResume
            p层.xx
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
        }
    
    

    有没有什么办法让Presenter或者一些其他需要感知act或者fgt自动感知,这样就可以解耦这种在生命周期调用方法的情况了。

    通过Lifecycle解决这个问题
    AppCompatActivity中提供了一个getLifecycle方法,通过addObserver() 就加入一个生命周期观察对象,如果当前activity变更了生命周期,ClickListener中的监听方法也会被调用。

    ClickListener类实现了LifecycleObserver接口,表示这个类需要感知生命周期,通过@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)注解来注解对应的生命周期方法

    
    public class MainActivity extends AppCompatActivity {
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ClickListener clickListener = new ClickListener(getLifecycle());
            getLifecycle().addObserver(clickListener);
        }
    
        @Override
        protected void onStart() {
            super.onStart();
        }
    }
    
    public class ClickListener implements LifecycleObserver {
        Lifecycle mLif;
    
        public ClickListener(Lifecycle lifecycle) {
            mLif = lifecycle;
        }
    
        @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
        void onResume() {
            Log.i("jinwei", "onResume=" + mLif.getCurrentState());
    
        }
    
        @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
        void onCreate() {
            Log.i("jinwei", "onCreate");
        }
    
        @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
        void onStop() {
            Log.i("jinwei", "onStop");
        }
    
        @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
        void onDestroy() {
            Log.i("jinwei", "onDestroy");
            if (mLif.getCurrentState().isAtLeast(Lifecycle.State.STARTED)) {
                Log.i("jinwei", "***************");
            }
    
        }
    
        @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
        void onPause() {
            Log.i("jinwei", "onPause");
        }
    
        @OnLifecycleEvent(Lifecycle.Event.ON_START)
        void onStart() {
            Log.i("jinwei", "onStart");
        }
    
    }
    

    我们也可以通过实现LifecycleOwner接口实现一个自己的Lifecycle。重点是我们创建了一个LifecycleRegistry类,

    public class MainActivity extends AppCompatActivity implements LifecycleOwner {
    
        LifecycleRegistry registry;
    
        @Override
        public Lifecycle getLifecycle() {
            return registry;
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            registry = new LifecycleRegistry(this);
            ClickListener clickListener = new ClickListener(getLifecycle());
            getLifecycle().addObserver(clickListener);
            setContentView(R.layout.activity_main);
           
        }
    

    Lifecycle解决的问题

    降低代码耦合,可以观察act和fgt的生命周期,实现自动监听,不需要手动在act和fgt中去调用,简化了代码增加了可维护的程度。

    LiveData和ViewModel

    我们开发中经常会有一个这样的问题,我们的一些请求网络的逻辑代码,或者操作数据层的代码都会写在activity层中。有可能经常有一个Activity类几千行代码。

    ViewModel
    ViewModel就是解决这个问题的,它的唯一作用和概念就是它只做数据层面的操作,比如网络请求,比如数据库操作。这些操作都可以放在ViewModel中,当我们项目的代码一大的时候就可以看到它的好处了。当然光是这样还不能满足我的期望,这个时候LiveData就上场了。

    LiveData
    LiveData是一个抽象的数据类,它的主要作用是提供通知给View层做数据刷新。通过LiveData包装的数据类,只要数据集一变更,监听通知的地方就会自动收到数据刷新的回调。

    class NameViewModel : ViewModel() {
    
    
        var name: MutableLiveData<String>? = MutableLiveData()
    
    
        /**
         * 宿主销毁后调用的,可以做一些清除数据的操作。
         */
        override fun onCleared() {
            super.onCleared()
            name = null;
            Log.i("jinwei", "onCleared");
        }
    
    
        //可以做网络请求
        fun loadData() {
            name?.value = "我是测试数据"
        }
    
    }
    
    public class MainActivity extends AppCompatActivity {
    
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            NameViewModel model = ViewModelProviders.of(this).get(NameViewModel.class);
            model.getName().observe(this, new Observer<String>() {
                @Override
                public void onChanged(@Nullable String s) {
                    Log.i("jinwei","onChanged  s =" +s);
                    Toast.makeText(getApplicationContext(), s, Toast.LENGTH_LONG);
                    TextView text = findViewById(R.id.text);
                    text.setText(s);
                }
            });
            model.loadData();
        }
    
     
    }
    

    LiveData的observe方法就是监听一个数据更新通知。

    声明周期
    ViewModel的声明周期依赖于Activiy或者Fragment,会在onCreate的时候创建ViewModel,ViewModel的生命周期一直持续到Activity最终销毁或Frament最终detached,期间由于屏幕旋转等配置变化引起的Activity销毁重建并不会导致ViewModel重建

    image

    初始化通过如下方式

    NameViewModel model = ViewModelProviders.of(this).get(NameViewModel.class);
    

    this参数一般为Activity或Fragment,因此ViewModelProvider可以获取组件的生命周期。

    Activity在生命周期中可能会触发多次onCreate(),而ViewModel则只会在第一次onCreate()时创建,然后直到最后Activity销毁。

    相关文章

      网友评论

        本文标题:Lifecycle LiveData 与 ViewModel

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