天天看點

Android接口回調設計

因為最近是期末,很多創客的同學在做Android的大作業。昨天有個同學遇到一個問題,就是異步網絡請求的資料解析傳回。看了一下他的代碼,他是一個函數去請求網絡擷取資料,并在該函數把解析到的資料傳回出去(類似下面的代碼):

  1. public String getHttpData(String url){
  2. String result = null;
  3. //此處借鑒一下xutils3網絡請求架構模拟一下網絡請求
  4.  x.http().get(params, new CommonCallback<String>() {  
  5.             @Override  
  6.             public void onCancelled(CancelledException arg0) {  
  7.             }  
  8.             @Override  
  9.             public void onError(Throwable ex, boolean isOnCallback) {  
  10.             }  
  11.             @Override  
  12.             public void onFinished() {    
  13.             }  
  14.             @Override  
  15.             public void onSuccess(String s) {  
  16.                   result = s;
  17.             }  
  18.         });  
  19. return result;
  20. }

因為xutils3的網絡請求架構預設是異步的,然後他調用這個方法的時候就會出現異步的網絡請求還沒有結束,也就是 result指向的位址還是null。于是就GG了,nullpointerexception。

其實這種問題很容易就能解決,在外面定義一個接口:

interface onGetDataListener<T>{//此處用泛型,讓接口能接收各種資料類型的傳回

void onGetDataSuccess(T t);//請求成功調用的方法

void onGetDataFailure(String s); //請求失敗調用的方法

}

然後改造上面的的工具類中的方法

  1. public void getHttpData(String url , onGetDataListener<String> listener){
  2. // String result = null;//删除此句
  3. //此處借鑒一下xutils3網絡請求架構模拟一下網絡請求
  4.  x.http().get(params, new CommonCallback<String>() {  
  5.             @Override  
  6.             public void onCancelled(CancelledException arg0) {  
  7.             }  
  8.             @Override  
  9.             public void onError(Throwable ex, boolean isOnCallback) {  
  10.     listener.onGetDataFailure("網絡請求失敗");
  11.             }  
  12.             @Override  
  13.             public void onFinished() {    
  14.             }  
  15.             @Override  
  16.             public void onSuccess(String s) {  
  17.                  // result = s;//删除此句
  18. listener.onGetDataSuccess(s);//利用接口把資料傳回出去
  19.             }  
  20.         });  
  21. // return result; //删除此句
  22. }

然後在外部使用的時候就new 出一個接口實作方法體,然後傳進去給工具類的方法

類似這樣**Utils.getHttpData("www.baidu.com",new onGetDataListener<String>{

void onGetDataSuccess(String t)//請求成功調用的方法

{

UIUtils.toast("請求成功,傳回的資料為:" + t);

}

void onGetDataFailure(String s) //請求失敗調用的方法

{

UIUtils.toast("請求失敗,傳回的資訊為:" + s);

}

});

此篇文章僅講解思想,類似MVP設計模式中model、view、presenter之間的利用接口回調互動模式。 其中的代碼隻用于展現思想,要實際運作還需要結合其它代碼。

本人菜鳥一枚,高手勿噴。歡迎與我交流。