Android中接口(Interface)的簡單使用

Android中接口(Interface)的簡單使用

目錄

Java中的接口可以被看作是只包含常量和抽象方法的抽象類

可以使用如下方式定義一個接口:

public interface InterfaceDemo {
    int i = 10;
    void method1();
    int method2();
}

使用1: 解決“多重繼承”的問題

Java語言本身是不支持類的多重繼承(多重繼承是指一個類從多個類繼承而來,即一個類擁有多個超類)的,但一個類卻可以實現多個接口。這樣,我們可以將一些抽象方法定義在接口中,間接地達到多重繼承的目的。
例如:

  • MyInterface1.java
public interface MyInterface1 {
    void fly();
}
  • MyInterface2.java
public interface MyInterface2 {
    void walk();
}
  • Bird.java
public class Bird implements MyInterface1, MyInterface2 {
    private static final String TAG = "Bird";
    @Override
    public void fly() {
        Log.i(TAG, "I can fly");
    }

    @Override
    public void walk() {
        Log.i(TAG, "I can walk");
    }
}

使用2: 定義一個規範(協議)

同一個接口可以有多個不同的實現類,但每一個實現類都必須重寫接口中所有的抽象方法。即接口不考慮這些實現類各自採用什麼方式實現這些功能,但它要求所有的實現類都必須有這些功能。
例如:
首先定義一個計算器的接口:Calculator.java,所有實現該接口的類,都必須具有計算兩個數相加、相減、相乘、相除的功能。

public interface Calculator {
    /** 計算器可以計算兩個數的和 */
    int add(int a, int b);
    /** 計算器可以計算兩個數的差 */
    int sub(int a, int b);
    /** 計算器可以計算兩個數的積 */
    long mul(int a, int b);
    /** 計算器可以計算兩個數的商 */
    float div(int a, int b);
}

再定義一個實現該接口的類ACalculator.java

public class ACalculator implements Calculator {
    @Override
    public int add(int a, int b) {
        return a + b;
    }

    @Override
    public int sub(int a, int b) {
        return a - b;
    }

    @Override
    public long mul(int a, int b) {
        return a * b;
    }

    @Override
    public float div(int a, int b) {
        return (float) a / (float) b;
    }
}

在其他類中使用ACalculator進行兩數之和的計算。其他類並不需要了解ACalculator是通過什麼方式計算的,只需要瞭解Calculator接口中的相關方法定義即可。
Test.java

public class Test {
    public static void main(String[] args) {
        Calculator calculator = new ACalculator();
        int sum = calculator.add(12, 14);
        System.out.println("sum = " + sum);
    }
}

使用3: 用於回調

我們知道,一般情況下主線程是不執行耗時任務的,如果遇到一些耗時任務(如網絡請求,文件讀寫,數據庫讀寫等等),我們會將其放入子線程中去執行,當執行完畢後,子線程再將執行結果返回給主線程。這個過程就是回調。

看一個例子。
首先定義一個回調接口。
OnInfoFetchCallback.java

public interface OnInfoFetchCallback {
    /** 獲取信息成功 */
    void onSuccess(String info);
    /** 獲取信息失敗 */
    void failure();
}

再定義一個用於獲取信息的任務類,在這個類中我們執行一些耗時操作。
InfoService.java

public class InfoService {
    private OnInfoFetchCallback callback;
    public InfoService(OnInfoFetchCallback callback) {
        this.callback = callback;
    }

    public void getInfo() {
        // 模擬一個耗時操作
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000);
                    // 信息獲取成功,傳遞結果
                    callback.onSuccess("結果是:" + new Date());
                } catch (InterruptedException e) {
                    // 信息獲取失敗
                    callback.failure();
                }
            }
        });
        thread.start();
    }
}

MainActivity中調用InfoService中的getInfo()方法執行耗時操作。

public class MainActivity extends AppCompatActivity implements OnInfoFetchCallback {
    private static final String TAG = "MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    /**
     * 獲取信息
     * @param view
     */
    public void fetchInfo(View view) {
        InfoService service = new InfoService(this);
        service.getInfo();
    }

    @Override
    public void onSuccess(String info) {
        Log.i(TAG, info);
    }

    @Override
    public void failure() {
        Log.i(TAG, "獲取信息失敗");
    }
}

由於MainActivity已經實現了OnInfoFetchCallback 接口,所以在實例化InfoService對象時,直接將this傳入即可。當任務執行結束後,調用MainActivity中的onSuccess(String info)failure()方法將結果返回。

MainActivity也可以不用實現OnInfoFetchCallback 接口,此時可以採用匿名內部類的寫法。
如下所示:

    /**
     * 獲取信息
     * @param view
     */
    public void fetchInfo(View view) {
        InfoService service = new InfoService(new OnInfoFetchCallback() {
            @Override
            public void onSuccess(String info) {
                Log.i(TAG, info);
            }

            @Override
            public void failure() {
                Log.i(TAG, "獲取信息失敗");
            }
        });
        service.getInfo();
    }

佈局文件非常簡單,只有一個按鈕。

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="cc.duduhuo.interfacedemo.MainActivity">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="獲取信息"
        android:onClick="fetchInfo"/>
</RelativeLayout>

Android中接口的三種基本使用方式已經介紹完了,該博文相關代碼可通過下方地址下載:

相關源碼點擊此處下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章