插件系统
Pan设计了一个针对生命周期的插件系统,以便使用者搭配Controller开发额外的特性。
自定义插件
Pan的自定义插件通过实现ControllerLifecyclePlugin接口实现:
public interface ControllerLifecyclePlugin{ void call(Controller controller, Class<? extends LifecycleObserver> lifecycleObserver, Object... parameters); }
插件会在所有Activity/Fragment生命周期的回调中调用插件,call方法一共有三个参数:
- Controller,即事件发生时,起作用的Controller,都会调用一次call
- 当前的事件,例如OnResume.class
- 如果当前的生命周期方法有参数,则都放在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。