Lifecycle LiveData 与 ViewModel

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? = 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() {
            @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重建

Lifecycle LiveData 与 ViewModel_第1张图片
image

初始化通过如下方式

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

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

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

你可能感兴趣的:(Lifecycle LiveData 与 ViewModel)