Skip to content

插件系统

Pan设计了一个针对生命周期的插件系统,以便使用者搭配Controller开发额外的特性。

自定义插件

Pan的自定义插件通过实现ControllerLifecyclePlugin接口实现:

public interface ControllerLifecyclePlugin{

    void call(Controller controller, Class<? extends LifecycleObserver> lifecycleObserver, Object... parameters);
}

插件会在所有Activity/Fragment生命周期的回调中调用插件,call方法一共有三个参数:

  1. Controller,即事件发生时,起作用的Controller,都会调用一次call
  2. 当前的事件,例如OnResume.class
  3. 如果当前的生命周期方法有参数,则都放在parameters中,例如onActivityResult的所有参数。

实现了插件后,可以在App的onCreate方法中安装插件:

Pan.installPlugin(new CustomPlugin());

EventBus插件的简单实现

如果项目中使用到了EventBus,那么一定会遇到EventBus的事件订阅和取消订阅两个成对出现的方法。这种事件处理逻辑应该放在Controller中,而通过写一个EventBus插件可以方便的完成对Controller的register:

public class EventBusPlugin implements ControllerLifecyclePlugin{

    private EventBus mEventBus = EventBus.getDefault();

    @Override public void call(Controller controller, Class<? extends LifecycleObserver> lifecycleObserver, Object... parameters){

        if(!controller instanceof EventBusController){ //定义EventBusController接口,避免无关的register
            return;
        }

        //对应Activity的onCreate,由于Pan工厂在onCreate中使用,所以使用OnPostCreate替代OnCreate
        if(OnPostCreate.class.equals(lifecycleObserver)){
            mEventBus.register(controller);
            return;
        }
        else if(OnDestroy.class.equals(lifecycleObserver)){
            mEventBus.unregister(controller);
            return;
        }

    }
}

//实现该接口的Controller会自动被register/unregister
public interface EventBusController{

}

当然上面只是一个简单的实现,当动态挂载Fragment时,Activity的OnPostCreate可能已经发生过了,所以Fragment里ViewModel的Controller将无法register。在上面的方法体中增加额外的监听Fragment的生命周期的函数,并处理一下重复监听的情况就可以轻松的解决了~

框架自带的AutoRender插件

这个插件主要实现了在onResume等情况下,自动加载数据并渲染,是框架自带的插件,用法参考常用的ViewModel实现类#AutoRenderViewModel