關於Callback回撥,傳遞引數

飄過的小熊發表於2016-09-05

關於Callback回撥,傳遞引數

標籤(空格分隔):CSDN



在實現網路通訊的時候學習人家的程式碼注意到了這種的Callback,當然使用的格式什麼的也不是上一篇文章上的

程式碼註釋較少,諒解
,上一種回撥主要是為了呼叫方法,而這一種實現主要是為了傳遞引數

第一種情況

class A實現了一個介面
class A 有一個class B的引用
class B有一個以class 實現的介面為引數的方法
通過class B的物件呼叫class B的方法,使用介面作為引數時就可以傳入class A的物件引用,就可以在這個方法中呼叫class A的其他方法

Talk is cheap,show me the caode

Method.java

public class Method {
    private String string;

    public Method(String string, SucessCallback sucessCallback, FailCallback failCallback) {
        this.string = string;
        if (sucessCallback != null) {

            sucessCallback.onSucess(string);
        } else {
            failCallback.onFail();
        }
    }

    public interface SucessCallback {
        void onSucess(String string);
    }

    public interface FailCallback {
        void onFail();
    }
}

程式碼簡單,可以看出該類持有兩個介面,一個成功的,一個是失敗的。然後在構造方法中也是使用了內部介面的例項引用。例項不為空的話就呼叫例項的方法。其實這裡的sucessCallback.onSucess(result)只是規定了方法中的動作。這裡的successCallback在執行的時候就是

    new Method.SucessCallback() {
        public void onSucess(String string) {
            // TODO Auto-generated method stub
            System.out.println(string);
        }
    }

沒錯,就是這一坨。就是這個例項,然後他要呼叫onSucess()方法,然而匿名的,這個方法在他內部被實現了,於是;result就進入了方法內部,就完成了資料的傳遞。

TestMethod.java

public class TestMethod {


    public static void main(String[] args) {
        new Method("這是什麼回撥?", new Method.SucessCallback() {

            public void onSucess(String string) {
                // TODO Auto-generated method stub
                System.out.println(string);
            }
        }, new Method.FailCallback() {

            public void onFail() {
                // TODO Auto-generated method stub

            }
        });
    }

}

這裡使用匿名的形式產生一個介面的例項。

與上面等效的TestMethod.java

public class TestMethod {
    class A implements SucessCallback {

        public void onSucess(String string) {
            // TODO Auto-generated method stub
            System.out.println(string);
        }

    }

    class B implements FailCallback {

        public void onFail() {
            // TODO Auto-generated method stub

        }

    }

    public static void main(String[] args) {

        TestMethod test = new TestMethod();
        TestMethod.A a = test.new A();
        TestMethod.B b = test.new B();

        new Method("這是什麼回撥?", a, b);

    }

}

這樣一改就水落石出了。介面,實現,以介面為引數的方法,傳入實現了介面的類的例項,都有了。如果把Method看作類B的話,類B中的以介面為引數的方法就是這個構造方法了。而假如TestMethod就是類A,那麼類B的引用及建立物件的過程就集中在使用了匿名建立Method類物件的過程上了。一切是那麼的自然,隨意。
主要是這裡介面擺放的位置很是奇怪,不是經常見到的那樣。而是直接放在了類B中。當然也可以放在其他地方。主要目的就是通過實現介面方法來進行引數的傳遞


再來一種情況

Method.java

public class Method {
    private String string;

    public void fun(String string, SucessCallback sucessCallback, FailCallback failCallback) {
        this.string = string;
        if (sucessCallback != null) {
            sucessCallback.onSucess(string);
        } else {
            failCallback.onFail();
        }
    }

    public String fun1(String string1, SucessCallback sucessCallback, FailCallback failCallback) {
        if (string.equals(string1)) {
            return "The two strings are equal";
        } else {
            string = string1;
        }
        if (sucessCallback != null) {
            sucessCallback.onSucess(string);
        }
        else {
            failCallback.onFail();
        }
        return null;
    }

    public interface SucessCallback {
        void onSucess(String string);
    }

    public interface FailCallback {
        void onFail();
    }
}

TestMethod.java

public class TestMethod {

    public static void main(String[] args) {

        Method method = new Method();
        method.fun("This is right", new Method.SucessCallback() {

            public void onSucess(String string) {
                // TODO Auto-generated method stub
                System.out.println(string);
            }
        }, new Method.FailCallback() {

            public void onFail() {
                // TODO Auto-generated method stub

            }
        });
        String string = method.fun1("This is right", new Method.SucessCallback() {

            public void onSucess(String string) {
                // TODO Auto-generated method stub
                System.out.println("Callback:" + string);
            }
        }, new Method.FailCallback() {

            public void onFail() {
                // TODO Auto-generated method stub

            }
        });
        System.out.println("The fun result:" + string);
        String string1 = method.fun1("This is not right", new Method.SucessCallback() {

            public void onSucess(String string) {
                // TODO Auto-generated method stub
                System.out.println("Callback1:" + string);
            }
        }, new Method.FailCallback() {

            public void onFail() {
                // TODO Auto-generated method stub

            }
        });

        System.out.println("The fun1 result:" + string1);
    }

}

這個就是比較標準的在方法中有介面的例項,只是介面放的地方還是有點不一樣。

國際慣例:總結

雖然耗費了點時間,但是這是我自己測試,一點一點的思考,拿到人家的程式碼分析。我愛一個人坐在這裡,加油,沒有目的地,不停的前行。努力到感動自己!!!

相關文章