本篇主要介绍一下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. Android开发中遇到的requestFeature() must be called before adding content异常

    缘起 上一篇博文中讲到了几种实现全屏显示Activity内容的方法.然而实际在实现中发现了一些问题,在本篇博文中进行总结下.首先交代一下开发环境,本人使用的是Android Studio 1.5.1, ...

  2. c#中的正则表达式

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. Java初识

    基础概念 特点: 完全面向对象,动态 解释性,简单.易移植,跨平台 安全健壮,高性能 多线程,分布式 三种核心机制: Java虚拟机 Java Virtual Machine 垃圾收集机制 Garba ...

  4. 关于SilverLight

    目前工作中用到SilverLight,有必要对其作一定的了解.

  5. How Will Java Technology Change My Life?

    How Will Java Technology Change My Life? We can't promise you fame, fortune, or even a job if you le ...

  6. jquery子元素选择器

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. Adb connection Error:远程主机强迫关闭了一个现有的连接

    在用手机调试程序时,有时会出现“Adb connection Error:远程主机强迫关闭了一个现有的连接”的错误. 出现这种错误时,可以按照以下步骤解决: (1)运行cmd.exe,并将目录CD到\ ...

  8. Maven依赖Scope标签用法

    在一个maven项目中,如果存在编译需要而发布不需要的jar包,可以用scope标签,值设为provided.如下: <dependency>            <groupId ...

  9. 第 1 章 Bootstrap 介绍

    学习要点:1.Bootstrap 概述2.Bootstrap 特点3.Bootstrap 结构4.创建第一个页面5.学习的各项准备 主讲教师:李炎恢 本节课我们主要了解一下 Boostrap 历史.特 ...

  10. 蘑菇街2015校招 Java研发笔试题 详解

    1. 对进程和线程描述正确的是( ) A.  父进程里的所有线程共享相同的地址空间,父进程的所有子进程共享相同的地址空间. B.  改变进程里面主线程的状态会影响其他线程的行为,改变父进程的状态不会影 ...