安卓開發介面回撥經典案例網路請求
阿新 • • 發佈:2019-01-22
在Android中到處可見介面回撥機制,尤其是UI事件處理方面。然後一般重新整理ui的處理:廣播,介面回撥,handle或者使用eventbus或是otto,總的來說也就是個監聽模式的使用吧。
回撥函式解釋
回撥函式就是一個通過函式指標呼叫的函式。如果你把函式的指標(地址)作為引數傳遞給另一個函式,當這個指標被用為呼叫它所指向的函式時,我們就說這是回撥函式。回撥函式不是由該函式的實現方直接呼叫,而是在特定的事件或條件發生時由另外的一方呼叫的,用於對該事件或條件進行響應。
形象比喻:
下面舉個通俗的例子:
比如宿舍的某個同學設定了一個鬧鈴,鬧鈴響時全宿舍的人都能聽到,但是張三比較勤奮,聽到鈴聲後起床了,李四比較懶,聽到鈴聲後還要睡會。我們可以把鬧鈴發出的鈴聲看作是介面,張三和李四都實現了這個“介面”,鬧鈴到一定時間後就要“響鈴”,響鈴就要發出“鈴聲”,“鈴聲”就去叫人,至於人會做什麼就是人本身的事情。
使用注意
在使用介面回撥的時候發現了一個經常犯的錯誤,就是回撥函式裡面的實現有可能是用多執行緒或者是非同步任務去做的,這就會導致我們期望函式回撥完畢去返回一個主函式的結果,實際發現是行不通的,因為如果回撥是多執行緒的話你是無法和主函式同步的,也就是返回的資料是錯誤的,這是非常隱祕的一個錯誤。
回撥的好處:
降低程式碼的耦合性,使程式碼更靈活、簡潔
步驟一 :定義回撥介面
/**
*
* 網路請求回撥介面
*/
public interface HttpCallBackListener {
void onSuccess(String respose);
void onError(Exception e);
}
步驟二:定義回撥函式(將介面作為引數)
/**
* 網路請求工具類
*/
public class HttpUtil {
public static void requestData(final String urlStr, final HttpCallBackListener listener) {
new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection connection = null ;
try {
URL url = new URL(urlStr);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(8000);
connection.setReadTimeout(8000);
connection.setDoInput(true);
connection.setDoOutput(true);
InputStream in = connection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
sb.append(line);
}
if (listener != null) {
//回撥onFinish方法
listener.onSuccess(sb.toString());
}
} catch (Exception e) {
if (listener != null) {
//回撥onError方法
listener.onError(e);
}
} finally {
if (connection != null) {
connection.disconnect();
}
}
}
}).start();
}
}
步驟三:使用回撥方法一
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
HttpUtil.requestData("請求的網址", new HttpCallBackListener() {
@Override
public void onSuccess(String respose) {
//處理請求
}
@Override
public void onError(Exception e) {
//處理異常
}
});
}
}
步驟三:使用回撥方法二
public class MainActivity extends AppCompatActivity implements HttpCallBackListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
HttpUtil.requestData("請求的網址", this);
}
@Override
public void onSuccess(String respose) {
//處理請求
}
@Override
public void onError(Exception e) {
//處理異常
}
}
就寫到這,哈哈,這都是網路框架裡面的一般套路,套路玩的深不深就看自己功夫了。