Jetpack之Lifecycle组件的使用

一 前言

上一篇文章中介绍了jetpack是什么,这次来介绍一下jetpack中的其中一个组件Lifecycle的基本使用;Lifecycle用于帮助开发者管理Activity和Fragment 的生命周期,由于Lifecycle是LiveData和ViewModel的基础,所以需要先学习它。

二 为何要使用Lifecycle

在应用开发中,对Activity和Fragment的生命周期相关代码的使用必不可少,假如有一个监听器,需要在各个生命周期阶段调用相对应的方法,那么就需要在每一个Acticity和Fragment中去一一调用,这样就会让代码变得臃肿不堪,让代码变得难以维护,而Lifecycle就是为了解决这个问题的,我们先来看看下面的例子:

public class MainActivity extends AppCompatActivity {
    
    
    private MyListener myListener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myListener = new MyListener(MainActivity.this);
    }

    @Override
    protected void onStart() {
    
    
        super.onStart();
        myListener.start();
    }

    @Override
    protected void onStop() {
    
    
        super.onStop();
        myListener.stop();
    }
}


class MyListener {
    
    
    public MyListener(Context context) {
    
    
    ...
    }
    void start() {
    
    
    ...
    }
    void stop() {
    
    
    ...
    }
}

再看一下MVP常见的情况:

public class MainActivity extends AppCompatActivity {
    
    
    private MyPresenter myPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myPresenter = new MyPresenter();
    }

    @Override
    protected void onResume() {
    
    
        super.onResume();
        myPresenter.onResume();
    }

    @Override
    protected void onPause() {
    
    
        super.onPause();
        myPresenter.onPause();
    }
}

class MyPresenter{
    
    
    void onResume() {
    
    
    ...
    }
    void onPause() {
    
    
    ...
    }
}

这两个例子也充分说明了问题,多个组件在Activity的生命周期方法里回调,很显然是不明智的,这时候我们就要一个能管理Activity和Fragment生命周期的库——Lifecycle

2.2 如何使用Lifecycle

依赖Lifecycle库

implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'

Lifecycle基本用法:
先列举一个Lifecycle一个简单的例子

public class MyObserver implements LifecycleObserver {
    
    
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void connectListener() {
    
    
        ...
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void disconnectListener() {
    
    
        ...
    }
}

myLifecycleOwner.getLifecycle().addObserver(new MyObserver());//1

新建了一个MyObserver类,他实现了LifecleObserver接口,此时MyObserver成为了一个Lifecycle的观察着。然后在注释1处,LifecycleOwner也是一个接口,其内部只有一个方法getLifecycle(),用来获取Lifecycle。在此处将MyObserver添加到lifecycler里,当lifecycler生命周期发生变化时,MyObserver就会监听到。如果使用是Java8 ,那么可以使用DefaultLifecycleObserver来替代LifecycleObserver:

class MyObserver implements DefaultLifecycleObserver {
    
    
     @Override
     public void onCreate(LifecycleOwner owner) {
    
    
         ...
    	 }
     }
 

三 Lifecycle应用举例

接着一次在Activity和MVP架构中举例使用:

3.1 Activity中使用

public class MainActivity extends AppCompatActivity {
    
    

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getLifecycle().addObserver(new MyObserver());//1
    }

    public class MyObserver implements LifecycleObserver{
    
    

        @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
        void onResume(){
    
    
            Log.d(TAG, "Lifecycle call onResume");
        }
        @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
        void onPause(){
    
    
            Log.d(TAG, "Lifecycle call onPause");
        }
    }

    @Override
    protected void onResume() {
    
    
        super.onResume();
        Log.d(TAG, "onResume");
    }

    @Override
    protected void onPause() {
    
    
        super.onPause();
        Log.d(TAG, "onPause");

    }
}

Activity和fragment默认实现了LifecycleOwner接口,所以在注视1处可以直接调用getLifecycle()方法获取lifecycle。这样MyObserver就可以观察到MainActivity的生命周期了。可以理解成LifecycleOwner是被观察着,MainActivity默认实现了LifecycleOwner接口,也就是MainActivity是被观察者。
运行结果:

D/MainActivity: onResume
D/MainActivity: Lifecycle call onResume
D/MainActivity: Lifecycle call onPause
D/MainActivity: onPause

3.2 MVP架构中的使用

public class MyPresenter implements IPresenter {
    
    
    private static final String TAG = "test";

    @Override
    public void onResume() {
    
    
        Log.d(TAG, "Lifecycle call onResume");
    }

    @Override
    public void onPause() {
    
    
        Log.d(TAG, "Lifecycle call onPause");
    }
}

interface IPresenter extends LifecycleObserver {
    
    

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    void onResume();

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    void onPause();
}
public class MyActivity extends AppCompatActivity {
    
    
    private LifecycleRegistry lifecycleRegistry;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);

        lifecycleRegistry = new LifecycleRegistry(this);
        lifecycleRegistry.markState(Lifecycle.State.CREATED);
    }

    @Override
    public void onStart() {
    
    
        super.onStart();
        lifecycleRegistry.markState(Lifecycle.State.STARTED);
    }

    @NonNull
    @Override
    public Lifecycle getLifecycle() {
    
    
        return lifecycleRegistry;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_39431405/article/details/117781261