• JAVA设计方法思考之如何实现一个方法执行完毕后自动执行下一个方法


    今天编程时,突然想起来在一些异步操作或Android原生库的时候,需要我们实现一些方法,

    这些方法只需要我们具体实现,然后他们会在适当的时候,自动被调用!

    例如AsyncTask,执行玩doInBackground()后会执行处理结果的postResult()方法,但我们并没有设置过他们的执行顺序。

    以前只知道他们的运行原理,但不知道具体的实现方法,细想起来,这是一个相当不错的代码设计,所以决定研究一下。

    因为一开始是通过实现方法来具体实现那些需要被执行的方法的,所以以为实现的方式是接口,

    思索很久,依然没想到接口里面如何设置方法的运行顺序,搜索发现没有相关的结果,只好去看下AsyncTask的源码,希望从源码中得到答案!

    而源码相当简洁有力,直接给出了我想要的答案:实现方法被调用的顺序控制,不是通过接口来实现的,而是通过抽象类!

    而具体控制程序方法的调用顺序的实现,就是在固定的方法里控制:例如AsyncTask的execute(具体的实现过程可以自己在IDE里面轻松查看,就不去具体剖析了)

    以下是本人模仿的示例代码,用于打印一个字符串数组的所有内容:

    public class interface
    {
         public static void main(String[] args){
        String[] b = {"a","b","c","d","e","f","g","h","i","j"};
            new Order(b) {
                @Override
                protected String onFirst(String s) {
                    System.out.println(s);
                    return null;
                }
    
                @Override
                protected String onNext(String s) {
                    System.out.println(s);
                    return null;
                }
    
                @Override
                protected void onCompleted(String s) {
                    System.out.println(s);
                }
            }.start();
        
        }
    
    }
    
    //具体实现方法顺序调用的抽象类
    abstract class Order{
    
        private String[] a;
        private int i = 0;
    
    
        public Order(String[] s){
            this.a = s;
        }
    
      //这个抽象对象通过本方法启动,而控制程序方法调用的具体过程就是从这里开始
        public String[] start(){
    
            onFirst(a[i++]);
    
            executor();
    
            return a;
    
        }
    
        public void executor(){
        //最后一个需要在完成时执行,也可以让next方法执行完后再去执行Completed方法
            while(i < a.length-2 && a[i] != null){
          a[i++] = onNext(a[i]);
            }
        //返回字符串数组的最后一个元素内容
            onCompleted(a[a.length-1]);
        }
    
      //下面这三个方法就是用来在新建对象时实现的方法,而我只想实现方法按照顺序调用,就简单地给出对应顺序的字符串
      //如果想要实现更复杂的功能,原理相同,具体问题具体分析
    
        protected abstract String onFirst(String s);
    
        protected abstract String onNext(String s);
    
        protected abstract void onCompleted(String s);
    
    }
  • 相关阅读:
    tomcat部署web应用的4种方法以及部署多个应用
    LeetCode算法题目解答汇总(转自四火的唠叨)
    16、手把手教你Extjs5(十六)Grid金额字段单位MVVM方式的选择
    15、手把手教你Extjs5(十五)各种Grid列的自定义渲染
    14、手把手教你Extjs5(十四)模块字段和Grid列的定义[2]
    13、手把手教你Extjs5(十三)模块字段和Grid列的定义[1]
    12、手把手教你Extjs5(十二)执行菜单命令在tabPanel中显示模块
    11、手把手教你Extjs5(十一)模块界面的总体设计
    10、手把手教你Extjs5(十)自定义模块的设计
    9、手把手教你Extjs5(九)使用MVVM特性控制菜单样式
  • 原文地址:https://www.cnblogs.com/thinfog/p/5962411.html
Copyright © 2020-2023  润新知