Android方法运行优先级-FSS开源框架之FssRunpriority

介绍

fss_runpriority实现了继承的方法可以在子类中自定义优先级执行。
gitHub地址:https://github.com/gongbox/fss

背景

在Android开发中,Activity或Fragment中经常会用initView,initListener,initData三个方法来初始化,那么你可能会将这三个方法声明在父类中,然后子类继承实现即可,如下:

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      ...
      initView();
      initData();
      initListener();
  }

  protected void initView() {
  }

  protected void initData() {
  }

  protected void initListener() {
  }

但如果这样做,initView,initData,initListener这三个方法的执行顺序固定了,然而有的时候我并不想以initView,initData,initListener 这样的顺序来执行,而是initView,initListener,initData或者其他顺序执行。fss_runpriority的出现便是为了解决这个问题。

使用与集成

implementation 'com.github.gongbox.fss:runpriority:{lastversion}'

然后在父类注册需要调用的方法:

//构造运行优先级方法
RunPriorityInfo runPriorityInfo = new RunPriorityInfo.Builder(this)
                .addMethod("initView") //对应方法:initView()
                //可以传任意个参数,但是要求必须存在该方法
                //.addMethod("initData", 12) 对应方法:initData(int xxx);
                //.addMethod("initData", 15L,"hello") 对应方法:initData(long xxx,String xxx);
                .addMethod("initData")
                .addMethod("initListener")
                .build();
//调用运行优先级方法,默认调用顺序为:initView() -> initData() -> initListener(),子类可使用@RunPriority注解自定义调用顺序
RunPriorityUtils.call(runPriorityInfo);

下面看一个Android的Activity的例子

class BaseActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        //构造运行优先级方法
        RunPriorityInfo runPriorityInfo = new RunPriorityInfo.Builder(this)
                .addMethod("initView")
                .addMethod("initData")
                .addMethod("initListener")
                .build();
        //调用运行优先级方法,默认调用顺序为:initView() -> initData() -> initListener(),子类可使用@RunPriority注解自定义调用顺序
        RunPriorityUtils.call(runPriorityInfo);
    }
    
    protected void initView() {
    }

    protected void initData() {
    }

    protected void initListener() {
    }
}

然后子类就可以根据需要自定义优先级,如下:

class TestActivity extends BaseActivity {
    //声明为高优先级,会优先调用
    @RunPriority(Priority.HIGH)
    @Override
    protected void initView() {
        super.initView();
        Log.i("RunPriority", "initView");
    }

    //声明为低优先级,会最后调用
    @RunPriority(Priority.LOW)
    @Override
    protected void initData() {
        super.initData();
        Log.i("RunPriority", "initData");
    }

    //声明为普通优先级,这也是默认的优先级,因此也可以不写
    //@RunPriority(Priority.NORMAL)  
    @Override
    protected void initListener() {
        super.initListener();
        Log.i("RunPriority", "initListener");
    }
}

上面的代码执行顺序是initView>initListener>initData。

注意

如果你的项目配置了混淆,请记得keep所有通过runpriority调用的方法

更多FSS框架:

如果想要了解fss框架的具体使用,我为大家提供了demo工程