您的位置:首页 > 理论基础 > 计算机网络

httpClient封装——异步、回调、下载

2015-12-22 17:49 489 查看
安卓学习部分就暂时不更新了,因为现在工作中直接做安卓开发了,以后会陆续记录工作中遇到的问题。

言归正传,最近工作开发安卓应用,由于我对安卓还不太熟,就先负责和服务端网络通信。要求:异步、回调。

一般我们在Java做异步的时候,到是新开一个线程,然后把逻辑放到线程里去执行。但是安卓里有了封装更好的AsyncTask,而已还有回调方法,具体用法请百度,很详细。我的封装就是基于它来实现的。

我就是把它封装成一个统一的声明(原本的如果要用的话,基本都是要声明一个内部类,比较麻烦),然后可以自定义回调类和回调方法(基于反射)。本来没什么好说的,但是因为有个下载的需求,本来也很简单,给我,然后开始写文件。服务器端这个接口也是我自己写的,因为对java.lang.reflect.InvocationTargetException.说我反射调用方法的时候出错了。这里记录一下:

在用反射调用方法的时候,如果被调用的方法报错了,反射的这个地方就会报java.lang.reflect.InvocationTargetException.
这样就很难找到根本出错的原因。没办法, 我把文件写入那段代码移到了反射之前,终于看到了错误来源:Caused by: android.os.NetworkOnMainThreadException。

这里要感谢http://www.cnblogs.com/freexiaoyu/archive/2012/04/13/2445707.html 这个帖。原来造成这样的错误原因是代码不符合Android规范,如果把上面访问方式改为异步操作就不会出现在4.0上访问出现 android.os.NetworkOnMainThreadException异常。

最后在代码修改成 在文件的时候,单独放到一个AsyncTask里执行,文件完美下载!

 

附:在编写服务器端和客户端中遇到的问题记录

1、服务器端异常javax.ws.rs.NotAcceptableException: HTTP 406 Not Acceptable

服务端配置的时候,设置了@Produces(MediaType.APPLICATION_OCTET_STREAM)

@Consumes({MediaType.APPLICATION_JSON}),即接受application/json类型,返回“application/octet-stream”类型,如果客户端发送的类型或者接受的类型不对,那么就会报错。

2、客户端android.os.NetworkOnMainThreadException:我理解的是安卓不让耗时的操作(比如IO读写等)在主线程里进行,防止线程堵塞。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: