因为最近是期末,很多创客的同学在做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之间的利用接口回调交互模式。 其中的代码只用于体现思想,要实际运行还需要结合其它代码。
本人菜鸟一枚,高手勿喷。欢迎与我交流。