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