1. 程式人生 > >Android 回撥函式的理解

Android 回撥函式的理解

一般我們在不同的應用傳遞資料,比較方便的是用廣播和回撥函式,當然還有其他方式,這裡學學回調函式的使用; 
什麼是回撥函式呢?在C/C++中,因為我們有指標這個東西,所以傳遞資料什麼的,挺方便,把那個指標地址發過來,改一下地址裡面的值即可即可;但是Java中是沒有指標這個概念的,所以,這個回撥函式則是用一個interface 介面和內部類實現的。 
而實用回撥函式的好處在於,可以很方便的監聽到某個類的狀態,常用的是監聽一個下載任務的進度和下載狀態等等。 
首先,先定義一個共有介面:

public interface myCallBack {
    public void fail(int error,String msg);
}
  • 1
  • 2
  • 3

ok,我們定義了一個介面,那怎麼使用呢?首先先思考一下,假如我有兩個類,b和c,我想在b類中監聽c類的fail這種狀態;那我只要把b類的例項給c,c實現方法就可以了。 
ok,那麼我們在c類中,實現方法

public class myc {

    public void test(int error,myCallBack mycallback){
        if (error ==1 ){
            mycallback.fail(1,"測試得到: "+1);
        }else{
            mycallback.fail(0,"沒有得到1");
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

然後,我們在b類中,例項化c類,然後我們的 myCallBack 例項傳遞過去

 new myc().test(1, new myCallBack() {
            @Override
            public void fail(int error, String msg) {
                Log.d(TAG, "fail: "+msg);
            }
        });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

列印如下:

zsr: fail: 測試得到: 1
  • 1
  • 2

在服務中心回到結果:

有時候,我們需要這種需求,比如一個下載任務,我們在服務中開啟了下載任務,我們需要在 MainActivity 去監聽下載任務的進度和下載狀態等一些資訊,但是我們啟動這個callback是在服務的,那怎麼辦? 
很簡單,只要把 MainAcivity 的callback 例項給服務就可以了,但是不是用 inputextra 的方式:

public class myb extends Service{
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    private myCallBack myCallBack = MainActivity.myCallBack;
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        new myc().test(0,myCallBack ); //把開啟這個服務的 callback 例項傳遞過來
        return super.onStartCommand(intent, flags, startId);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

這樣,我們就可以在 MainActivity 中監聽c類中的狀態了:

public static myCallBack myCallBack =  new myCallBack(){
        @Override
        public void fail(int error, String msg) {
            Toast.makeText(mContext, msg, Toast.LENGTH_SHORT).show();
        }
    };