android框架搭建——封装一个属于自己的网络工具类

来源:互联网 发布:犹太神话 知乎 编辑:程序博客网 时间:2024/06/06 06:48

之前使用AsyncHttpClient,Volley等网络框架,总觉得"占地面积"太大,比较理想的情况是用一两行代码就可以获取接口的数据,所以决定自己封装一个网络工具类。不多说,直接上代码;

package com.xiaoteng.dms.utils;import java.util.ArrayList;import java.util.List;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http.client.HttpClient;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.message.BasicNameValuePair;import org.apache.http.util.EntityUtils;import org.json.JSONObject;import android.annotation.SuppressLint;import android.annotation.TargetApi;import android.os.Build;import android.os.StrictMode;import android.util.Log;public class SyncHttpUtil {public static JSONObject sendGet(String baseUrl, String[] params, String[] values) {String url = null == params[0] ? baseUrl : baseUrl + "?" + params[0] + "=" + values[0];if (params.length >= 2) {for (int i = 1; i < params.length; i++) {url = url + "&" + params[i] + "=" + values[i];}}HttpGet request = new HttpGet(url);HttpClient client = new DefaultHttpClient();JSONObject result = null;try {HttpResponse response = client.execute(request);String res = "";if (response.getStatusLine().getStatusCode() == 200) {res = EntityUtils.toString(response.getEntity());}result = new JSONObject(res);} catch (Exception e) {e.printStackTrace();Log.i("info", "e>>" + e);}return result;}public static JSONObject sendPost(String baseUrl, String[] params, String... values) {List<NameValuePair> list = null;JSONObject result = null;if (params.length > 0) {for (int i = 1; i < params.length; i++) {NameValuePair nameValue = new BasicNameValuePair(params[i], values[i]);list = new ArrayList<NameValuePair>();list.add(nameValue);}}try {HttpEntity entity = new UrlEncodedFormEntity(list, "utf-8");HttpPost request = new HttpPost(baseUrl);request.setEntity(entity);HttpClient client = new DefaultHttpClient();HttpResponse response = client.execute(request);String res = "";if (response.getStatusLine().getStatusCode() == 200) {res = EntityUtils.toString(response.getEntity());}result = new JSONObject(res);} catch (Exception e) {e.printStackTrace();}return result;}}
调用sendGet方法时只要填写url,接口参数names,接口参数values三个参数即可获取到接口数据,十分方便。但在调用一些接口会报RunOnMainThread错误,即在主线程中执行错误。若想解决这个错误,又想保持代码的同步性,即保证在调完接口后再进行下一步操作,那么需要对工具类进行一些修改:

<span style="white-space:pre"></span>// 碰到RunOnMainThread问题,,要加这两个@@TargetApi(Build.VERSION_CODES.GINGERBREAD)@SuppressLint("NewApi")public static JSONObject sendGet(String baseUrl, String[] params, String[] values) {/* * 解决netwok问题 */StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();StrictMode.setThreadPolicy(policy);String url = null == params[0] ? baseUrl : baseUrl + "?" + params[0] + "=" + values[0];if (params.length >= 2) {for (int i = 1; i < params.length; i++) {url = url + "&" + params[i] + "=" + values[i];}}Log.i("info", "url>" + url);HttpGet request = new HttpGet(url);HttpClient client = new DefaultHttpClient();JSONObject result = null;try {HttpResponse response = client.execute(request);String res = "";if (response.getStatusLine().getStatusCode() == 200) {res = EntityUtils.toString(response.getEntity());}result = new JSONObject(res);} catch (Exception e) {e.printStackTrace();Log.i("info", "e>>" + e);}return result;}

ok了,这样一个简单的网络工具类就封装好了,若是想提高项目的性能,采用异步的形式获取数据,直接new Thread()一个新线程,在线程里面调用工具类即可。至于工具类里面的各行代码就不详细解释了,都是最基本的HttpClient操作。使用HttpClient需要两个jar包:httpclient-4.5.1.jar,httpcore-4.4.3.jar,在网上直接搜httpcomponents-client-4.5.1即可。

4 1