本篇主要介绍一下Android中经常用到的网络请求框架;

客户端网络请求,就是客户端发起网络请求,经过网络框架的特殊处理,让后将请求发送的服务器,服务器根据

请求的参数,返回客户端需要的数据,经过网络框架的处理,最后返回给客户端需要的数据,具体如下图所示:

如上图所示,网络框架其实就是架设在客户端和服务器之间的通信桥梁,负责处理客户端的请求数据,并想服务器发送请求任务

然后处理服务器返回的数据,并将最终结果返回给客户端,具体代码实现如下:

网络请求类:

 package com.jiao.yichenetframe.net;

 import java.util.ArrayList;
import android.content.Context;
import android.os.AsyncTask; import com.jiao.yichenetframe.net.RequestAsyncTask.ResponseCallBack; /**
* 连接View层与网络交互的中间层 用来创建异步任务请求网络 管理所有的网络请求任务
*
*/
public class RequestNet {
public static RequestNet requestnet = null;
public static ArrayList<AsyncTask> arrayAsyncTask; public static RequestNet getRequestNet() {
// 单例,保证整个项目中只有一个网络请求实体
if (requestnet == null) {
requestnet = new RequestNet();
arrayAsyncTask = new ArrayList<AsyncTask>();
}
return requestnet;
} /**
* 请求网络数据
* */
public RequestAsyncTask RequestData(Context context, String ip,
Object jsonObject, ResponseCallBack callBack1) {
RequestAsyncTask asynctask = new RequestAsyncTask(context, ip,
jsonObject, callBack1); asynctask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
arrayAsyncTask.add(asynctask);
return asynctask;
} }

网络任务具体执行类(真正的发起网络请求任务,处理客户端传递过来的参数,并处理服务器返回的数据)

 package com.jiao.yichenetframe.net;

 import java.io.File;
import java.util.ArrayList;
import java.util.Map;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.Context;
import android.os.AsyncTask;
import android.text.TextUtils;
import com.jiao.yichenetframe.tool.ConstantTool;
import com.jiao.yichenetframe.tool.MsLog; /**
* 主要负责网络的异步请求
*
* @author pengqm
*
*/
public class RequestAsyncTask extends AsyncTask<String, Integer, String> {
private String ip;// 接口地址
private Object jsonObject;// 接口参数对象
private ResponseCallBack callBack1;// 接口回调
private GetJsonRequest getJsonRequest;
private HttpUrlConnection_Request urlConnection_Req;
private ArrayList<File> arrFile = null;
private Context mcontext; public RequestAsyncTask(Context context, String ip, Object jsonObject,
ResponseCallBack callBack1) {
this.ip = ip;
this.jsonObject = jsonObject;
this.callBack1 = callBack1;
mcontext = context;
getJsonRequest = new GetJsonRequest(context);
urlConnection_Req = new HttpUrlConnection_Request(mcontext);
} public void setArrayFile(ArrayList<File> Files) {
arrFile = Files;
} public Context getContent() {
return mcontext;
} @Override
protected String doInBackground(String... arg0) {
String jsonarr = null;
MsLog.e("ip", ip);
try {
if (jsonObject == null) {
jsonarr = urlConnection_Req.makeHttpRequest(ip,
ConstantTool.post, null);
} else {
// 得到拼接的访问接口字符串
String jsonStr = getJsonRequest.getJsonObject(jsonObject);
MsLog.e("Request_jsonStr", jsonStr);
// 如果arrFile等于null 表示普通请求数据,否则带图片请求
if (!TextUtils.isEmpty(jsonStr)) {
if (arrFile != null) {
Map map = getJsonRequest.objectMap(jsonObject);
jsonarr = HttpUrlConnection_Request_PD.uploadSubmit(ip,
map, arrFile, mcontext);
} else {
jsonarr = urlConnection_Req.makeHttpRequest(ip,
ConstantTool.post, jsonStr);
}
}
}
} catch (Exception e) {
// e.printStackTrace();
// publishProgress(0); }
if (isCancelled()) {
return null;
}
MsLog.e("jsonarr----", jsonarr);
return jsonarr;
} @Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
} @Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
// 接口访问完成后 将任务从任务列表中移除
RequestNet.getRequestNet().arrayAsyncTask.remove(this);
if (callBack1 == null) {
return;
}
if (result != null) {
// 根据返回值 判断是否是错误码
if (result.equals(ConstantTool.LOCALERRO_NETTIMEROUT)) {
// 网络超时
callBack1.onErrorResponse(ConstantTool.LOCALERRO_NETTIMEROUT);
} else {// 不是错误码 表示数据正常 接口访问成功 返回json字符串
try {
JSONObject jb;
jb = new JSONObject(result);
callBack1.onResponse(jb);
} catch (JSONException e) {
e.printStackTrace();
// 网络异常
callBack1.onErrorResponse(ConstantTool.LOCALERROR_UNUSUAL);
}
}
} else {// 没有返回值
// 无网络连接
callBack1.onErrorResponse(ConstantTool.LOCALERRO_NONETWORK);
}
} public interface ResponseCallBack {
public void onResponse(JSONObject response); public void onErrorResponse(String error);
}
}

请求字符串处理工具类(用来处理请求参数,创建符合服务器和客户端事先约定的请求规则的请求字符串)

注:我是根据我们约定的规则来定义此类的,不同的项目或不同的公司规则不一致,可以自行修改

 package com.jiao.yichenetframe.net;

 import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import android.content.Context;
import com.google.gson.Gson; /**
* 将请求接口的数据进行包装
* */
public class GetJsonRequest {
public Context mcontext; public GetJsonRequest(Context context) {
mcontext = context;
} /**
*
* 根据对象属性名获取属性的值
*
*/
private Object getFieldValueByName(String fieldName, Object o) {
try {
String firstLetter = fieldName.substring(0, 1).toUpperCase();
String getter = "get" + firstLetter + fieldName.substring(1);
Method method = o.getClass().getMethod(getter, new Class[] {});
Object value = method.invoke(o, new Object[] {});
return value;
} catch (Exception e) {
e.printStackTrace();
return null;
}
} /**
*
* 通过反射将实体类获取字段,进行拼装返回一个完整的字符串,用于请求服务器
*
*/
public String getJsonObject(Object object) {
Gson gson = new Gson();
String j = gson.toJson(object); //遍历实体类的各个参数值,并生成一个map集合
try {
HashMap<String, Object> map = new HashMap<String, Object>();
Field[] fields = object.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
String name = field.getName();
Object value = getFieldValueByName(name, object);
if (value == null) {
value = "";
}
map.put(name, value); }
//遍历map集合,根据既定规则拼接访问接口的字符串
String target_string = "";
for (Map.Entry<String, Object> me : map.entrySet()) {
target_string = target_string + me.getKey() + "="
+ me.getValue() + "&";
}
//去掉最后的"&"
target_string = target_string.substring(0,target_string.lastIndexOf("&"));
return target_string;
} catch (Exception e) {
e.printStackTrace();
}
return null;
} /**
* 根据对象转换map,上传图片时携带的参数
* */
public Map<String, Object> objectMap(Object object) {
HashMap<String, Object> map = new HashMap<String, Object>();
try {
Field[] fields = object.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
String name = field.getName();
Object value = getFieldValueByName(name, object);
if (value == null) {
value = "";
}
map.put(name, value);
}
return map;
} catch (Exception e) {
e.printStackTrace();
}
return null; } }

网络工具类(和服务器交互,向服务器传递数据,并接收服务器返回的数据)

 package com.jiao.yichenetframe.net;

 import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.SocketTimeoutException;
import java.net.URL;
import org.json.JSONArray;
import android.content.Context;
import com.jiao.yichenetframe.YiCheNetFrameApplication;
import com.jiao.yichenetframe.tool.ConstantTool;
import com.jiao.yichenetframe.tool.Utils; /**
* 采用HttpUrlConnection请求服务类
* */
public class HttpUrlConnection_Request {
InputStream inputstream = null;
JSONArray jObj = null;
String result = null;
public HttpUrlConnection_Request urlConnection_request = null;
private Context mcontext; // constructor
public HttpUrlConnection_Request(Context context) {
mcontext = context;
} // function get json from url
public String makeHttpRequest(String url, String method, String params) {
HttpURLConnection urlConnection = null;
// Making HTTP request
try {
String versionCode = YiCheNetFrameApplication.VERSIONCODE;
if (method.equals(ConstantTool.post)) {
urlConnection = (HttpURLConnection) new URL(url)
.openConnection();
urlConnection.setConnectTimeout(40000);
urlConnection.setReadTimeout(40000);
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);
urlConnection.setRequestProperty("connection", "close");
urlConnection.setChunkedStreamingMode(0);
urlConnection.setRequestMethod(method);
urlConnection.setRequestProperty("MallAppVersion", versionCode);
urlConnection.setRequestProperty("SystemType",
ConstantTool.SystemType);
urlConnection.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
urlConnection.setRequestProperty("AccessToken",
"4b5b8693-5ebb-4f34-9070-d8b3f3875ad7");
urlConnection.setRequestProperty("Charsert", "UTF-8");
OutputStream out = new BufferedOutputStream(
urlConnection.getOutputStream());
if (params != null) {
out.write(params.getBytes("UTF-8"));
}
out.flush();
out.close();
int responseCode = urlConnection.getResponseCode();
if (responseCode == 200) {
inputstream = new BufferedInputStream(
urlConnection.getInputStream());
} else {
inputstream = new BufferedInputStream(
urlConnection.getErrorStream());
}
}
result = Utils.convertStreamToString(inputstream).trim();
inputstream.close();
inputstream = null;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (SocketTimeoutException e) {
result = ConstantTool.LOCALERRO_NETTIMEROUT;
} catch (IOException e) {
e.printStackTrace();
} finally {
urlConnection.disconnect();
}
// return JSON String
return result; }
}

网络请求示例:

 // 获取列表四个参数分别是:Context、url请求接口地址、object请求参数(封装对象)、请求回调
RequestNet.getRequestNet().RequestData(this, url,
object, new ResponseCallBack() {
@Override
public void onResponse(JSONObject response) { // 网络请求成功 返回json
System.out.println("返回值:" + response); } @Override
public void onErrorResponse(String error) {
// 网络请求失败 失败原因
System.out.println("错误:" + error);
}
});

Android网络请求框架的更多相关文章

  1. Android网络请求框架AsyncHttpClient实例详解(配合JSON解析调用接口)

    最近做项目要求使用到网络,想来想去选择了AsyncHttpClient框架开进行APP开发.在这里把我工作期间遇到的问题以及对AsyncHttpClient的使用经验做出相应总结,希望能对您的学习有所 ...

  2. Android 网络请求框架android-async-http问题

    今天通过接口请求服务器的一些app数据,发现一个很奇怪的问题,请求一个链接的时候,通常在第一次请求发起的时候没有什么问题,能很快的拿到数据,但是 往后再去请求的时候就会等待很久,而且最后会请求失败,一 ...

  3. Android 网络请求框架Retrofit

    Retrofit是Square公司开发的一款针对Android网络请求的框架,Retrofit2底层基于OkHttp实现的,OkHttp现在已经得到Google官方认可,大量的app都采用OkHttp ...

  4. Android网络请求框架之Retrofit实践

    网络访问框架经过了从使用最原始的AsyncTask构建简单的网络访问框架(甚至不能称为框架),后来使用开源的android-async-http库,再到使用google发布的volley库,一直不懈的 ...

  5. Android 网络请求框架

    1.okHttp 特点 简单.灵活.无连接.无状态 优势: 谷歌官方API在6.0之后在Android SDK中移除了HttpClient,然后他火了起来, 他支持SPDY(谷歌开发的基于TCP应用层 ...

  6. Java/Android 网络请求框架/库

    Android 图片缓存框架  最上面的最优先 com.facebook.fresco:fresco:0.12.0                7.26.2016最新 Universal-Image ...

  7. Ok-Http | Android 网络请求框架使用方式

    POST : package he3.sd.util; import com.parkingwang.okhttp3.LogInterceptor.LogInterceptor; import jav ...

  8. RxAndroid+RxJava+Gson+retrofit+okhttp初步搭建android网络请求框架

    新建工程集成, 一.工具集成(2017-4-27) 首先第一步集成retrofit retrofit 的 git 网站: https://github.com/square/retrofit 在git ...

  9. xamarin android网络请求总结

    xamarin android中网络请求的框架非常多,在项目中使用的是第三方的一个网络请求框架restsharp,应该是github上.net网络请求最多star的框架,没有之一.这里就简单汇总了其他 ...

随机推荐

  1. WinForm打印

    WinForm打印要用打印控件: PageSetupDialog:打印设置对话框 PrintDialog:打印对话框 PrintDocument:要打印的对象,非常重要 PrintPreviewCon ...

  2. WinPhone学习笔记(四)——磁贴

    对每个Windows Phone的使用者来说,给他们的第一印象就是大大小小的磁贴——Metro,本篇介绍的是Windows Phone的磁贴,提到的有开始菜单的磁贴,也有在App里面的磁贴. 开始菜单 ...

  3. C语言的字符串分割

    说起来很有意思,自认为对C语言理解得还是比较深刻的.但居然到今天才知道有个strtok函数,试用了一下突然感慨以前做了多少重复劳动.每次需要解析配置文件,每次需要分割字符串,居然都是自己去分割字符串, ...

  4. Java总结篇系列:Java多线程(二)

    本文承接上一篇文章<Java总结篇系列:Java多线程(一)>. 四.Java多线程的阻塞状态与线程控制 上文已经提到Java阻塞的几种具体类型.下面分别看下引起Java线程阻塞的主要方法 ...

  5. Learn Spring Framework(continue update...)

    Part I. Overview of Spring Framework The Spring Framework is a lightweight(轻量级的) solution and a pote ...

  6. JMS中的消息通信模型

    1. MQ简介: 消息队列(Message Queue,简称MQ),是应用程序与应用程序之间的一种通信方法.应用程序通过发送和检索出入列队的针对应用程序的数据 - 消息来通信,而无需专用连接来链接它们 ...

  7. WebView的使用及添加进度条

    实现的效果比较简单类似于微信打开网页,头部有个进度条显示加载进度 下载地址:http://download.csdn.net/detail/qq_29774291/9666941 1.在安卓端加载一个 ...

  8. jvm运行数据分布

    本人看的深入理解jvm(该版本的java se7) java运行时数据区域 Java虚拟机在执行java程序时,把内存划分为几个不同的阶段,存在不同的存在时间.不同的用途 先上图 程序计数器:是jvm ...

  9. Android总结篇系列:Android Intent

    Intent在Android中的重要性不言而喻.本文主要总结下Intent使用过程中需要注意的一些问题. 1.隐式Intent AndroidManifest.xml声明时<intent-fil ...

  10. CSS3与页面布局学习笔记(二)——盒子模型(Box Model)、边距折叠、内联与块标签、CSSReset

    一.盒子模型(Box Model) 盒子模型也有人称为框模型,HTML中的多数元素都会在浏览器中生成一个矩形的区域,每个区域包含四个组成部分,从外向内依次是:外边距(Margin).边框(Border ...