1. 程式人生 > >Android筆記:詳解介面回撥(interface/abstract)的用法

Android筆記:詳解介面回撥(interface/abstract)的用法

使用場景
小明想要問小紅借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可以定義有方法體的方法;