1. 程式人生 > >正確理解和使用回撥方法

正確理解和使用回撥方法

回撥方法是一個很容易理解的方法,但是很多人講解的時候混入了各種奇怪的概念所以導致回撥方法很不清晰。我現在給大家講解一下回調方法,講的不對的地方歡迎大神指出。
我的主函式
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
glSurfaceView = new MyGLSurfaceView();
}
我在主函式建立了這個glSurface物件,至於這個物件是幹什麼的,傳什麼,大家都不用關心,總之我就是在主函式中建立了一個物件,然後傳了一些引數進去。
然後這個glSurfaceView類裡面又在執行各種複雜操作。
這個物件在它內部執行復雜操作的時候,我的主函式是看不到,也控制不到的。這個時候我們想要在glSurfaceViews中某個節點給我們主函式傳資料,或者做什麼,那是完全做不到的。所以我們要控制的話只能這樣
Mainactivity mactivity;
glSurfaceView = new MyGLSurfaceView(mactivity);
然後在glSurfaceView的構造方法裡面寫
Mainactivity glSurfaceViewactivity=mactivity;
再寫
glSurfaceView.xxxxxxx
這樣就出現一個巨大的問題。
我們每次建立glSurfaceView的時候,是不是都會在裡面建立一個activity,那你得把這個activity再裡面使用以後又銷燬。不然就會建立大量activity例項
要是activity裡面有大量資源,毫無疑問,你的工程很快就會卡死
而且一些複雜程式,我們是根本看不見這個glSurfaceView裡面的任何內容的,可能它是被完全封裝好的。這個時候我們還想讓它做了某件事的時候,去通知我們的activity,根本就不可能。
這個時候,我還想達成剛才的效果,就不得不引入回撥函數了。
回撥函式是幹什麼的呢,其實很簡單,就是我在glSurfaceView這個函式裡面做什麼的時候,我給它一個標記。每當這個標記執行到的時候,別的函式就可以做一些別的事情了,你可以將它理解為一個通知,通知其他函式,我的事情做完了,或者我做了這件事情了,現在來做你的事情了。

 public interface Callback{
        void start();
        void stop();
    }

    private Callback mCallback;
    public void setCallback(Callback callback){
        mCallback = callback;
    }

先在glSurfacaView裡面定義一個介面,在裡面寫上你要設定回撥的地方

@Override
public void onPrepared(MediaPlayer mp) {

       if(mCallback!=null){
            mCallback.start();

        }
    }

public void stop() {

        if(mCallback != null){
            mCallback.stop();

        }

      }
      這樣當這兩個方法執行的時候,就可以執行我們的回調了。

在glSurfaceView初始化的時候寫上如下語句
xxx.setcallback()
最後mainActivity繼承glSurfaceView.callback
在自動生成的方法裡面寫stop和start裡面你要做什麼,在對應的時候就能實現這個操作了
現在很多封裝的程式都給你再很多地方留下了回撥的介面,你不可能去修改對應的程式,但是通過修改各種介面,就可以修改對應的地方

總結
介面就是A函式在B函式中呼叫A函式的方法,聽起來很繞,其實就是我們沒法同時控制兩個函式,所以只能在第二個函式做了某些事情的時候給它設定一個節點,在這個節點我們我們可以在別的函式執行其他操作。
理解回撥千萬不要混入非同步的概念,網路上面很多講解回撥的文章往往喜歡混入非同步的概念,導致讀者無法正確理解回撥