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中接口的三種基本使用方式已經介紹完了,該博文相關代碼可通過下方地址下載: