之前使用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 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();
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错误,即在主线程中执行错误。若想解决这个错误,又想保持代码的同步性,即保证在调完接口后再进行下一步操作,那么需要对工具类进行一些修改:
// 碰到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即可。