第一行代码--自定义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

相关文章

使用Redis快速实现共享Session登录的详细步骤

《使用Redis快速实现共享Session登录的详细步骤》在Web开发中,Session通常用于存储用户的会话信息,允许用户在多个页面之间保持登录状态,Redis是一个开源的高性能键值数据库,广泛用于... 目录前言实现原理:步骤:使用Redis实现共享Session登录1. 引入Redis依赖2. 配置R

使用Python的requests库调用API接口的详细步骤

《使用Python的requests库调用API接口的详细步骤》使用Python的requests库调用API接口是开发中最常用的方式之一,它简化了HTTP请求的处理流程,以下是详细步骤和实战示例,涵... 目录一、准备工作:安装 requests 库二、基本调用流程(以 RESTful API 为例)1.

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

Python yield与yield from的简单使用方式

《Pythonyield与yieldfrom的简单使用方式》生成器通过yield定义,可在处理I/O时暂停执行并返回部分结果,待其他任务完成后继续,yieldfrom用于将一个生成器的值传递给另一... 目录python yield与yield from的使用代码结构总结Python yield与yield

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

pandas数据的合并concat()和merge()方式

《pandas数据的合并concat()和merge()方式》Pandas中concat沿轴合并数据框(行或列),merge基于键连接(内/外/左/右),concat用于纵向或横向拼接,merge用于... 目录concat() 轴向连接合并(1) join='outer',axis=0(2)join='o

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

批量导入txt数据到的redis过程

《批量导入txt数据到的redis过程》用户通过将Redis命令逐行写入txt文件,利用管道模式运行客户端,成功执行批量删除以Product*匹配的Key操作,提高了数据清理效率... 目录批量导入txt数据到Redisjs把redis命令按一条 一行写到txt中管道命令运行redis客户端成功了批量删除k

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的