第一行代码--自定义HttpUtils类并使用回调获取服务器返回数据

本文主要是介绍第一行代码--自定义HttpUtils类并使用回调获取服务器返回数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在<<第一行代码>>一书中学习到的技巧,再此实验整合:

在编写网络应用时,我们经常会用到发送Http请求的地方,然而每次发送Http请求的代码几乎是相同的,所以通常情况下,我们将这些通用的网络操作提取到一个公共类里,并提供一个静态方法。(类似简单工厂模式)

以使用HttpURLConnection为例。

public class HttpUtils {public static InputStream sendHttpRequest(final String address) {HttpURLConnection connection = null;try {URL url = new URL(address);connection = (HttpURLConnection) url.openConnection();connection.setDoInput(true);connection.setRequestMethod("GET");connection.setReadTimeout(5000);connection.setDoOutput(true);InputStream inputStream = connection.getInputStream();//返回一个输入流return inputStream;} catch (MalformedURLException e) {e.printStackTrace();} catch (ProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (connection != null)connection.disconnect();}return null;}
}

以后每当发起一条请求就可以简单写成:

String address = "http://www.baidu.com";
//发送get请求,获取输入流
InputStream is= HttpUtils.sendHttpRequest(address);

此时会有一个问题,网络请求通常是耗时操作,而在方法中我们没有开启一个子线程进行网络操作,这样就有可能调用sendHttpRequest()方法时阻塞主线程。

而正因为耗时操作都在子线程中进行,如果我们在sendHttpRequest( )方法中开启一个子线程进行通信,那么服务器返回的数据是无法及时传递的,因为sendHttpRequest( )方法会在服务器还没来得及响应时就执行结束了,也就无法返回响应的数据了。

解决方案:采用JAVA回调机制

先自定义一个接口:

public interface HttpCallbackListener{//当服务器成功响应的时候调用void  onFinish(String response);//当网络操作出现错误的时候我们调用void onError(Exception e);
}

然后修改HttpUtils中代码:

public class HttpUtils {public static void sendHttpRequest(final String address,final HttpCallBackListener listener) {new Thread (new Runnable () {@Overridepublic void run () {HttpURLConnection connection = null;try {URL url = new URL(address);connection = (HttpURLConnection) url.openConnection();connection.setDoInput(true);connection.setRequestMethod("GET");connection.setReadTimeout(5000);connection.setDoOutput(true);InputStream inputStream = connection.getInputStream();if (listener!=null){//回调onFinish()listener.onFinish (inputStream);}} catch (Exception e) {if (listener!=null){//回调onError()listener.onError (e);}}  finally {if (connection != null)connection.disconnect();}}}).start ();}
}

即在子线程中不返回数据,而将服务器返回的数据交给传递给接口,在接口中接收流并进行操作,如果出现异常则传入到onError()方法中。

在调用时要传入两个参数了

HttpUtils.sendHttpRequest (address, new HttpCallBackListener () {@Overridepublic void onFinish (InputStream inputStream) {//对返回内容执行操作}@Overridepublic void onError (Exception e) {//对异常进行处理}});

到这里,若是服务器返回数据成功,则返回数据交给调用方处理;若获取数据异常,则将错误信息交给调用方处理。

另外,onFinish( )和onError( )仍然是在子线程中运行的,因此不可以在里面执行UI操作,要使用异步消息处理机制。

这篇关于第一行代码--自定义HttpUtils类并使用回调获取服务器返回数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/217747

相关文章

SpringBoot使用ffmpeg实现视频压缩

《SpringBoot使用ffmpeg实现视频压缩》FFmpeg是一个开源的跨平台多媒体处理工具集,用于录制,转换,编辑和流式传输音频和视频,本文将使用ffmpeg实现视频压缩功能,有需要的可以参考... 目录核心功能1.格式转换2.编解码3.音视频处理4.流媒体支持5.滤镜(Filter)安装配置linu

Redis中的Lettuce使用详解

《Redis中的Lettuce使用详解》Lettuce是一个高级的、线程安全的Redis客户端,用于与Redis数据库交互,Lettuce是一个功能强大、使用方便的Redis客户端,适用于各种规模的J... 目录简介特点连接池连接池特点连接池管理连接池优势连接池配置参数监控常用监控工具通过JMX监控通过Pr

解决mysql插入数据锁等待超时报错:Lock wait timeout exceeded;try restarting transaction

《解决mysql插入数据锁等待超时报错:Lockwaittimeoutexceeded;tryrestartingtransaction》:本文主要介绍解决mysql插入数据锁等待超时报... 目录报错信息解决办法1、数据库中执行如下sql2、再到 INNODB_TRX 事务表中查看总结报错信息Lock

apache的commons-pool2原理与使用实践记录

《apache的commons-pool2原理与使用实践记录》ApacheCommonsPool2是一个高效的对象池化框架,通过复用昂贵资源(如数据库连接、线程、网络连接)优化系统性能,这篇文章主... 目录一、核心原理与组件二、使用步骤详解(以数据库连接池为例)三、高级配置与优化四、典型应用场景五、注意事

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3

使用Python实现Windows系统垃圾清理

《使用Python实现Windows系统垃圾清理》Windows自带的磁盘清理工具功能有限,无法深度清理各类垃圾文件,所以本文为大家介绍了如何使用Python+PyQt5开发一个Windows系统垃圾... 目录一、开发背景与工具概述1.1 为什么需要专业清理工具1.2 工具设计理念二、工具核心功能解析2.

MySQL 添加索引5种方式示例详解(实用sql代码)

《MySQL添加索引5种方式示例详解(实用sql代码)》在MySQL数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中,下面给大家分享MySQL添加索引5种方式示例详解(实用sql代码),... 在mysql数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中。索引可以在创建表时定义,也可

Linux系统之stress-ng测压工具的使用

《Linux系统之stress-ng测压工具的使用》:本文主要介绍Linux系统之stress-ng测压工具的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、理论1.stress工具简介与安装2.语法及参数3.具体安装二、实验1.运行8 cpu, 4 fo

Java使用MethodHandle来替代反射,提高性能问题

《Java使用MethodHandle来替代反射,提高性能问题》:本文主要介绍Java使用MethodHandle来替代反射,提高性能问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录一、认识MethodHandle1、简介2、使用方式3、与反射的区别二、示例1、基本使用2、(重要)

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元