Android筆記:詳解介面回撥(interface/abstract)的用法
阿新 • • 發佈:2019-01-30
使用場景
小明想要問小紅借10塊錢,小紅答應借. 但是小紅很關心小明還錢,因為小紅想要在小明還錢之後,去買好吃的蛋糕.
這個時候, 小紅又不能時時刻刻催著小明還錢. 只能等小明還錢的時候通知小紅了;
那麼, 小明通知小紅的這個過程, 我把它叫做 回撥;
上程式碼(Interface部分):
1:首先定義個 還錢的回撥介面
public interface OnRepay{
boolean onRepay();
}
2:因為是小明還錢, 所以在小明(XiaoMing)類中,呼叫介面方法,進行還錢
//小明, 用來借錢的類, 同時也是呼叫回撥函式的類
public class XiaoMing {
OnRepay XiaoHong;// 小紅
public XiaoMing(OnRepay listener) {
this.XiaoHong = listener;
}
// 小明借錢的方法
public void JieQian() {
Log.e("小明", "小明借了小紅10塊錢,小明說:\"不要著急, 還錢的時候,我會告訴你.\"");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 過了一會兒, 小明要還錢了,這個時候要通知小紅. 通知的方式,就用到了回撥
if (XiaoHong.onRepay()) {// 告訴小紅, 小明還錢了;
//如果小紅收到小明還的10塊錢;
Log.e("小紅", "謝謝的還錢,我已經收到");
}else {
//如果小紅沒有收到10塊錢(可能路上被強盜搶了),那麼....
Log.e("小紅", "小明還我的錢,我沒有收到,可能被快遞員私吞了, 請再還一次");
}
}
}
3:因為小紅想要知道還錢的結果,所以小紅需要實現這個介面方法
public class MainActivity extends Activity implements OnRepay {
XiaoMing XiaoMing;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
XiaoMing = new XiaoMing(this);
}
@Override
public boolean onRepay() {// 小明還錢的時候,小紅接收, 返回true:收到了錢, 返回false:沒收收到
Log.e("小紅", "小紅沒有收到小明的還錢,可能被快遞員私吞了...");
return false;
}
}
4:OK,步驟完成了,就差啟動 小明借錢了;
//這個方法放在MainActivity中
public void button1(View view) {
XiaoMing.JieQian();
}
/**對應的Button宣告
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="button1"
android:text="Interface回撥" />
*/
上程式碼(abstract部分):
1:宣告借錢的過程(和interface類似)
public abstract class OnRepayCallback {
abstract boolean onRepayCallBack();
}
2:實現小明的借錢方法
public void JieQianCallback(OnRepayCallback callback){
Log.e("小明", "小明借了小紅10塊錢,小明說:\"不要著急, 還錢的時候,我會告訴你.\"");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 過了一會兒, 小明要還錢了,這個時候要通知小紅. 通知的方式,就用到了回撥
if (callback.onRepayCallBack()) {// 告訴小紅, 小明還錢了;
//如果小紅收到小明還的10塊錢;
Log.e("小紅", "謝謝的還錢,我已經收到");
}else {
//如果小紅沒有收到10塊錢(可能路上被強盜搶了),那麼....
Log.e("小紅", "小明還我的錢,我沒有收到,可能被快遞員私吞了, 請再還一次");
}
}
3:小紅借錢給小明,並且處理小明還錢的結果
public class MainActivity extends Activity implements OnRepay {
XiaoMing XiaoMing;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
XiaoMing = new XiaoMing(this);
}
/**對應的Button宣告
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="button2"
android:text="Abstract回撥" />
*/
public void button2(View view) {
XiaoMing.JieQianCallback(new OnRepayCallback() {
@Override
boolean onRepayCallBack() {
Log.e("小紅", "小紅收到小明的還錢10元...");
return true;
}
});
}
}
總結一下
Interface 和 Abstract, 目的都是實現回撥, 選擇的時候可以任意選一種, 你熟練就行;
區別:
Interface 定義的方法都不能有方法體,而 Abstract可以定義有方法體的方法;