Android HTTP网络请求的异步实现

前言

大家都知道网络操作的响应时间是不定的,所有的网络操作都应该放在一个异步操作中处理,而且为了模块解耦,我们希望网络操作由专门的类来处理。所有网络数据发送,数据接收都有某几个类来实现,外部其它模块只要调用和处理回调函数即可。外部模块和网络模块之间的调用关系可以用如下图表示:

调用端只要创建Request对象,设置参数,发起请求,即可。最后结果通过回调函数返回。右边的异步任务,HttpClient创建,参数解析,错误处理全部交给网络处理模块来完成。由此来看,这个网络模块其实是重复性很高的开发工作,为了避免重复造轮子,下面就给大家介绍下我们工作中实现的网络操作模块及相应类的实现。

1.调用端代码:

Get或Post请求

protected void doWebTest()
 {
  String url = "http://www.target.com/abcd";

  try {
   MyHttpRequest http = new MyHttpRequest(url);
   //如果是Post请求,则设置.如果是get请求,请不要设置post参数
   //http.addPost("data", "testpostvalue");
   //post参数结束,get请求,不要添加上面addPost代码
   http.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
   http.addHeader("Accept-Encoding", "gzip, deflate, sdch");
   http.addHeader("Accept-Language","zh-CN,zh;q=0.8");
   http.addHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36");

   http.StartRequest(new INetResponseListener() {
    @Override
    public void OnRequestComplete(NetResponse result) {
     if(result.isSuccess())
     {
      String resultStr = result.resultStr;
      //resultStr就是网络返回的数据
     }else
     {
      Exception ee = result.getException();
     }
    }
   });

  } catch (Exception e) {
   e.printStackTrace();
  }
 }

以上是调用端需要实现的源码,是不是很少代码就可以完成网络请求?下面就为大家揭开这个网络处理类的面纱。

2.主要类介绍
 1.AbstractRequester:一个抽象的网络请求类
 2.MyHttpRequest::实例化的网络请求类。如果开发者有其它特殊处理需求,可以继承AbstractRequester 自己重新实现parseResponse
 3.HttpEngine:HttpClient网络引擎类,最终的网络请求由这个类处理
 4.HttpRequestData:传递给AsyncTask的参数类
 5.NetResponse:返回给调用者的响应类
 6.INetResponseListener:异步回调的interface

类之间的关系如下图所示:

2.1 AbstractRequester
抽象的网络管理类,类定义如下:

public abstract class AbstractRequester extends AsyncTask<HttpRequestData,Integer,NetResponse> {
 ...
 /**
  * 根据需求创建传递给http发送的参数
  * @return
  */
 abstract HttpRequestData createData();
 /**
  * 根据返回的流,解析生成相应的对象
  * @param in
  * @return
  */
 abstract NetResponse parseResponse(InputStream in);

 //执行完成后的回调函数
 protected void onPostExecute(NetResponse result) {
  super.onPostExecute(result);
  if(listener!=null)
  {
   listener.OnRequestComplete(result);
  }
 }

 //网络请求开始处理
 protected NetResponse doInBackground(HttpRequestData... reqArgs) {
  //因内容比较多。具体查看源码
 }

 public void StartRequest(INetResponseListener aListener){
 //具体查看源码
 }
}

对于一些有其它特殊需求的开发者,只需要继承这个类,并实现它的抽象接口,如果是通用需求,则可以直接使用下面的MyHttpRequest类:

abstract HttpRequestData createData();
abstract NetResponse parseResponse(InputStream in);

2.2 MyHttpRequest
继承并实现了AbstractRequester的网络处理类,支持Get和Post类型,支持自定义添加headers参数。
对于普通的网络请求和返回已经够用,开发者可以直接使用。

2.3 HttpEngine
网络请求引擎类。主要流程如下:
 1.创建createHttpClient
 2.判断参数有效性
 3.判断get或post
 4.创建对应的HttpGet或HttpPost
 5.设置各类参数
 6.调用httpClient.execute执行网络请求
 7.解析和判断网络返回结果
 8.生成Stream对象并返回

2.4 HttpRequestData

传递给AsyncTask的参数类,用于设置http请求的各类参数。

2.5 NetResponse
返回给调用者的类对象,包括状态、数据和异常。

2.6 INetResponseListener
定义很简单,源码如下:

public interface INetResponseListener {

 /**
  * 网络请求返回
  * @param result
  */
 public void OnRequestComplete(NetResponse result);

}

调用者只要实现这个interface,异步接收返回结果即可,返回结果就是NetResponse对象。

 - 常见问题

1. AsyncTask说明
 大家都知道AsyncTask是异步的,所以网络请求通过AsyncTask来实现,通过AyncTask的好处是轻量级异步,而且可以操作ui线程,比如更新进度条等。但AsyncTask也存在以下一些问题:
 •task需要在ui线程中创建和启用,所以AbstractRequester 对象的创建和调用StartRequest请在ui线程中完成
 •API 11也就是3.0以后,AsyncTask是排队执行,所以如果其中一个任务出现较耗时,其它网络请求需要等待;如果你想同步执行,要修改execute为executeOnExecutor(但不推荐做这个修改)

2. 权限
在xml中添加网络操作权限:

<uses-permission android:name="android.permission.INTERNET" />

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android开发中的几种网络请求方式详解

    Android应用经常会和服务器端交互,这就需要手机客户端发送网络请求,下面介绍四种常用网络请求方式,我这边是通过Android单元测试来完成这四种方法的,还不清楚Android的单元测试的同学们请看Android开发技巧总结中的Android单元测试的步骤一文. Java.NET包中的HttpURLConnection类 Get方式: // Get方式请求 public static void requestByGet() throws Exception { String path = "h

  • Android Xutils3网络请求的封装详解及实例代码

     Xutils3网络请求的封装详解 封装了一个Xutil3的网络请求工具类,分享给大家,本人水平有限,不足之处欢迎指出. 使用前先配置xutils3: 1.gradle中添加 compile 'org.xutils:xutils:3.3.40' 2.自定义Application /** * Created by Joe on 2016/9/25. */ public class MyApp extends Application { @Override public void onCreate(

  • android 网络请求库volley方法详解

    使用volley进行网络请求:需先将volley包导入androidstudio中 File下的Project Structrue,点加号导包 volley网络请求步骤: 1. 创建请求队列       RequestQueue queue = Volley.newRequestQueue(this); 2.创建请求对象(3种) StringRequest request = new StringRequest("请求方法","请求的网络地址","成功的网

  • Android基于OkHttpUtils网络请求的二次封装

    OkHttpUtils网络请求为什么进行二次封装? 1.减少代码量 2.后期换网络处理框架方便 二次封装的实现原理 1.将网络请求提取在一个方法中 2.对里面的可变参数,可以通过参数传递过去,也可以提供一个set方法传递过去 3.对于请求失败和成功,我们可以使用接口回调,让调用该方法的对象处理 封装后的网络处理类的功能 1.网络请求 2.xml数据转换成javaBean 每一个处理网络请求的ListView都要处理的3数据方法 1.初始化数据 2.下拉刷新数据 3.上拉加载数据 封装前的代码 /

  • Android最基本的异步网络请求框架

    本篇文章我们来一起写一个最基本的Android异步网络请求框架,借此来了解下Android中网络请求的相关知识.由于个人水平有限,文中难免存在疏忽和谬误,希望大家可以指出,谢谢大家. 1. 同步网络请求 以HTTP的GET请求为例,我们来介绍一下Android中一个基本的同步请求框架的实现.直接贴代码: public class HttpUtils { public static byte[] get(String urlString) { HttpURLConnection urlConnec

  • Android GZip的使用-开发中网络请求的压缩实例详解

    Android  GZip: gzip是GNUzip的缩写,它是一个GNU自由软件的文件压缩程序. HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术.一般服务器中都安装有这个功能模块的,服务器端不需做改动. 当浏览器支持gzip 格式的时候, 服务器端会传输gzip格式的数据. 从Http 技术细节上讲,就是 http request 头中 有 "Accept-Encoding", "gzip" ,response 中就有返回头Content-En

  • Android网络请求库android-async-http介绍

    Android网络请求库:android-async-http开源框架 之前有一篇描述了客户端请求服务器端的方式-Post的请求方式.今天介绍一个请求服务器的一个开源库-android-async-http库. 1. 概念: 这个网络请求库是基于Apache HttpClient库之上的一个异步网络请求处理库,网络处理均基于Android的非UI线程,通过回调方法(匿名内部类)处理请求结果. 2. 特征: (1).处理异步Http请求,并通过匿名内部类处理回调结果 **(2).**Http异步请

  • Android HTTP网络请求的异步实现

    前言 大家都知道网络操作的响应时间是不定的,所有的网络操作都应该放在一个异步操作中处理,而且为了模块解耦,我们希望网络操作由专门的类来处理.所有网络数据发送,数据接收都有某几个类来实现,外部其它模块只要调用和处理回调函数即可.外部模块和网络模块之间的调用关系可以用如下图表示: 调用端只要创建Request对象,设置参数,发起请求,即可.最后结果通过回调函数返回.右边的异步任务,HttpClient创建,参数解析,错误处理全部交给网络处理模块来完成.由此来看,这个网络模块其实是重复性很高的开发工作

  • android Retrofit2网络请求封装介绍

    目录 1. Retrofit使用 2. Retrofit封装 3. RetrofitUtil使用 最后 1. Retrofit使用 Retrofit是一个现在网络请求框架,先来说一下怎么使用 网络权限(添加到AndroidManifest.xml) <uses-permission android:name="android.permission.INTERNET" /> gradle依赖(添加到build.gradle) implementation("com.

  • Android实现网络加载时的对话框功能

    效果预览 简要说明 现在android程序网络请求操作是必不可少的,然而拥有好的交互体验的程序对网络耗时操作的处理尤为重要. 代码说明: dialog_loading.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="

  • iOS当多个网络请求完成后执行下一步的方法详解

    前言 在开发中,我们很容易遇到这样的需求,需要我们同时做多个网络请求,所有网络请求都完成后才能进行下一步的操作. 网络请求的任务是提交给子线程异步处理了,网络请求这样的任务也就快速执行完毕了,但是网络请求是一个任务,处理收到的网络响应又是一个任务,注意不要把这两个过程混为一谈. 如下载多个图片,下载完了才能展示,今天我们就来研究一下这个问题的解决方案. 解决方法 1.首先,我们创建一个项目,然后做一般性的做法,不做任何处理去连续请求一个接口10次: 先在viewDidLoad中创建第一种情况.

  • Android网络请求框架Retrofit详解

    介绍: Retrofit 是Square公司开发的一款针对Android网络请求的框架,Retrofit2底层基于OkHttp实现的,OkHttp现在已经得到Google官方认可,大量的app都采用OkHttp做网络请求.本文使用Retrofit2.0.0版本进行实例演示. 使用Retrofit可以进行GET,POST,PUT,DELETE等请求方式. 同步请求:需要在子线程中完成,会阻塞主线程. Response response = call.execute().body(); 异步请求:请

  • Android 网络请求框架Volley实例详解

    Android 网络请求框架Volley实例详解 首先上效果图 Logcat日志信息on Reponse Volley特别适合数据量不大但是通信频繁的场景,像文件上传下载不适合! 首先第一步 用到的RequetQueue RequestQueue.Java RequestQueue请求队列首先得先说一下,ReuqestQueue是如何对请求进行管理的...RequestQueue是对所有的请求进行保存...然后通过自身的start()方法开启一个CacheDispatcher线程用于缓存调度,开

  • IOS开发中异步网络请求上实现同步逻辑

    IOS开发中异步网络请求上实现同步逻辑 前提: 可能遇到一些问题,比如上传多个数据,需要等多个数据上传成功后做一定的处理,而且一个个上传,万一哪个上传失败了,后面就不需要上传了,直接报错. 之前ASI的网络库中是有同步请求的接口,所以很好处理,AFNetwork的网络库只有异步的网络请求,该怎么实现呢? 1.循环异步拼组 - (void)uploadFile:(NSArray *)imageArray atIndex:(NSInteger)index imagesCount:(NSInteger

随机推荐