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

1 篇文章 0 订阅
0 篇文章 0 订阅

安卓学习部分就暂时不更新了,因为现在工作中直接做安卓开发了,以后会陆续记录工作中遇到的问题。

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

一般我们在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读写等)在主线程里进行,防止线程堵塞。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一个工作时写的工具包。实现了Java版的Promise 和 HttpClientHttpClient 支持同步和异步两种方式,也支持多种不同实现。目前有Netty 和 Apache Compoenet两种实现。本次上传移除了Netty实现。主要解决生产环境中同步httpclient造成的IO阻塞问题。同步http请求将导致 tomcat 的业务线程被阻塞。一旦某接口网络出现问题,可能会阻塞tomcat业务线程,从而无法处理正常业务。很多公司使用另开线程池的方式进行异步调用来解决tomcat线程阻塞问题。但由于本系统中接口网络太不稳定,使用线程池也将导致线程池中的线程不断加大,不管使用怎样的线程池策略,最终要么线程池线程全部挂起,要么部分任务被延迟执行,要么丢失部分任务。这在我们的系统中仍然不能接受。因此才有了这个组件的开发。该组件是单线程非阻塞式的,类似于JS中的ajax请求。都使用单线程异步回调的方式。目前该组件已经初步测试通过。如果大家也需要这样的组件,可以下载尝试一下。所有关键注释都已经写了,如有不明白可以发送邮件 [email protected] 代码分为3个maven模块。 commons-ext : 实现Promise commons-tools: 实现 异步httpclient commons-parent:父模块 测试代码在 commons-tools/src/test/java/HttpTest.java 中. 要求至少Java 8 版本。 注释已经写好。这里贴出异步的http部分测试代码。 /** * 异步方法的Fluent写法 */ public void testAsyncHttpFluent() { SimpleRequest.Get("http://www.baidu.com") .header("h1", "hv1") .header("h2", "hv2") .parameter("p1", "pv1") .parameter("p2", "pv2") .chartUTF8() .build() .asyncExecute() .then(SimpleAsyncHttpClient::asString) .then(html -> { System.out.println(html); }) .catching(Throwable::printStackTrace);//如果有异常,则打印异常 }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值