因為最近是期末,很多創客的同學在做Android的大作業。昨天有個同學遇到一個問題,就是異步網絡請求的資料解析傳回。看了一下他的代碼,他是一個函數去請求網絡擷取資料,并在該函數把解析到的資料傳回出去(類似下面的代碼):
- public String getHttpData(String url){
- String result = null;
- //此處借鑒一下xutils3網絡請求架構模拟一下網絡請求
- x.http().get(params, new CommonCallback<String>() {
- @Override
- public void onCancelled(CancelledException arg0) {
- }
- @Override
- public void onError(Throwable ex, boolean isOnCallback) {
- }
- @Override
- public void onFinished() {
- }
- @Override
- public void onSuccess(String s) {
- result = s;
- }
- });
- return result;
- }
因為xutils3的網絡請求架構預設是異步的,然後他調用這個方法的時候就會出現異步的網絡請求還沒有結束,也就是 result指向的位址還是null。于是就GG了,nullpointerexception。
其實這種問題很容易就能解決,在外面定義一個接口:
interface onGetDataListener<T>{//此處用泛型,讓接口能接收各種資料類型的傳回
void onGetDataSuccess(T t);//請求成功調用的方法
void onGetDataFailure(String s); //請求失敗調用的方法
}
然後改造上面的的工具類中的方法
- public void getHttpData(String url , onGetDataListener<String> listener){
- // String result = null;//删除此句
- //此處借鑒一下xutils3網絡請求架構模拟一下網絡請求
- x.http().get(params, new CommonCallback<String>() {
- @Override
- public void onCancelled(CancelledException arg0) {
- }
- @Override
- public void onError(Throwable ex, boolean isOnCallback) {
- listener.onGetDataFailure("網絡請求失敗");
- }
- @Override
- public void onFinished() {
- }
- @Override
- public void onSuccess(String s) {
- // result = s;//删除此句
- listener.onGetDataSuccess(s);//利用接口把資料傳回出去
- }
- });
- // return result; //删除此句
- }
然後在外部使用的時候就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之間的利用接口回調互動模式。 其中的代碼隻用于展現思想,要實際運作還需要結合其它代碼。
本人菜鳥一枚,高手勿噴。歡迎與我交流。