介紹
Lifecycle 使得其它組件可以獲取類似activity和Fragment那樣響應(yīng)生命周期的能力。我們可以直接在fragment和activity的相關(guān)生命周期函數(shù)中進(jìn)行操作,但是這樣的代碼不太好維護(hù),耦合性太高。 而生lifecycle-aware組件利用觀察者模式,使得其它對“生命周期”感興趣的組件能自己處理,而不必直接在fragment和activity中進(jìn)行處理。背景
最近項(xiàng)目組要啟動一個新項(xiàng)目,以前的項(xiàng)目都是使用簡單的mvp架構(gòu)。其中有一個繁瑣的處理就是,p層和view層強(qiáng)耦合,原因就在于生命周期的處理方式。現(xiàn)在全新啟動一個項(xiàng)目,完全沒有技術(shù)負(fù)擔(dān),所以對這個問題使用lifecycle-aware組件進(jìn)行優(yōu)化。依賴
allprojects {
repositories {
jcenter()
google()//添加Google Maven倉庫
}
}
dependencies {
// Java8 support for Lifecycles
implementation "android.arch.lifecycle:common-java8:1.1.1"
// Lifecycles only (no ViewModel or LiveData)
implementation "android.arch.lifecycle:runtime:1.1.1"
annotationProcessor "android.arch.lifecycle:compiler:1.1.1"
}
- Presenter層實(shí)現(xiàn)
懶加載fragment相關(guān)的生命周期接口
public interface CoinSignalLifecycleObserver extends DefaultLifecycleObserver {
default void onFragmentFirstVisible(){}
default void onFragmentResume(){}
default void onFragmentPause(){}
}
presenter接口
public interface BasePresenter extends CoinSignalLifecycleObserver {
default void disPose(Disposable disposable) {
if (disposable != null && !disposable.isDisposed()) {
disposable.dispose();
}
}
}
fragment的實(shí)現(xiàn)
public class BaseMvpFragment<T extends BasePresenter> extends Fragment{
protected T presenter;
protected void initPresenter(){}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initPresenter();
if (presenter != null) {
getLifecycle().addObserver(presenter);
}
}
}
Activity的實(shí)現(xiàn),其中activity里有沉浸式相關(guān)代碼
public abstract class BaseMvpActivity<T extends BasePresenter> extends AppCompatActivity implements LifecycleOwner {
protected LifecycleRegistry mLifecycleRegistry;
protected T presenter;
protected ImmersiveHelper immersiveHelper;
protected View statusView;
protected abstract void initPresenter();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLifecycleRegistry = new LifecycleRegistry(this);
if (presenter != null) {
getLifecycle().addObserver(presenter);
}
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
setLayout();
statusView = findViewById(R.id.status_bar_view);
if (statusView != null) {
immersiveHelper = new ImmersiveHelper(this, statusView);
}
}
protected abstract void setLayout();
@Override
protected void onStart() {
super.onStart();
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
}
@Override
protected void onStop() {
super.onStop();
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP);
}
@Override
protected void onDestroy() {
super.onDestroy();
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);
if (immersiveHelper == null){
return;
}
immersiveHelper.destroy();
immersiveHelper = null;
}
@Override
protected void onResume() {
super.onResume();
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
MobclickAgent.onResume(this);
}
@Override
protected void onPause() {
super.onPause();
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE);
MobclickAgent.onPause(this);
}
/**
* 是否可以使用沉浸式
* Is immersion bar enabled boolean.
*
* @return the boolean
*/
public boolean isImmersionBarEnabled() {
return immersiveHelper.isImmersionBarEnabled();
}
public void initImmersionBar() {
//在BaseActivity里初始化
immersiveHelper.initImmersionBar();
}
public void hideSoftKeyBoard() {
if (immersiveHelper == null){
return;
}
immersiveHelper.hideSoftKeyBoard();
}
public void finish() {
super.finish();
hideSoftKeyBoard();
}
}
- 總結(jié)
如上代碼,在實(shí)現(xiàn)p層和view層相關(guān)代碼的時候,它們倆個層次的耦合變得很低。