Android 回撥函式的理解
阿新 • • 發佈:2019-01-09
一般我們在不同的應用傳遞資料,比較方便的是用廣播和回撥函式,當然還有其他方式,這裡學學回調函式的使用;
什麼是回撥函式呢?在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();
}
};