天天看点

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之间的利用接口回调交互模式。 其中的代码只用于体现思想,要实际运行还需要结合其它代码。

本人菜鸟一枚,高手勿喷。欢迎与我交流。