netLoader基于imageloader参考封装的, 是把线程管理和网络请求封装成一个大类,开发者不用担心线程的维护。只要在ui线程中传进上传的参数即可,网络请求包括get请求,post携带参数上传的请求,post上传文件,post上传参数并且携带文件的,本类中的网络请求部分不携带cookie,开发者请自己进封装类中,找到方法名为load前缀的方法体中进行修改。
好了现在我就开始讲解本类的用法。
1.开发环境
Androidstudio开发人员需要导入okhttp的依赖(注意哦 是两个依赖—上网查询)
Eclipse的用户需要导入okhttp的jar包(注意哦 是两个jar—上网查询)
2.如何使用
首先一个类必须初始化,本类中采用的是单类模式(2种,开发人员自行选择)
第一种:采用本类默认的设置
NetLoader loader =NetLoader.getInstance();(可以在application中进行全局的初始化);
第二种:开发人员自行设置参数
NetLoader loader =NetLoader.getInstance(int threadCount,Type type );
threadCount:代表着线程池中线程的数量
Type:代表执行任务的顺序呢,是本类中的枚举类
Public Type{
FIFO,LIFO;
}
FIFO:先进先出
LIFO:后进先出
开发人员自己设定
建议开发人员直接在application初始化,如果担心该实例会随时被销毁,那么在方法用处直接用单例调用;
3.使用理念
如果用上述2中的第二种方法初始化,那么在用处可以直接用NetLoader.getInstance().load….();开发人员可以放心你设置的参数会保存起来,不用重新设置。
4.网络请求
(1)get请求
NetLoader.getInstance().loadGetData(url,new NetResponseListener() {
@Override
publicvoid success(String resultString) {
//TODO Auto-generated method stub
tv_net.setText(resultString);
Log.i("tag+成功", resultString);
}
@Override
publicvoid fail(String failString, Exception e) {
//TODO Auto-generated method stub
Log.i("tag+ 失败", failString);
}
});
(2)post带参数的请求(有小瑕疵,只能是string类型的参数,开发人员开一根据需要修改源码还是load方法)
你会看到BasicNameValuePair 这个类
BasicNameValuePair pair = new BasicNameValuePair(String,String);这里是你要上传的参数前面是键后面是值;
然后装入list< BasicNameValuePair>中
再调用
NetLoader.getInstance().loadOrdinaryPostData(url,new NetResponseListener() {
@Override
publicvoid success(String resultString) {
//TODO Auto-generated method stub
}
@Override
publicvoid fail(String failString, Exception e) {
//TODO Auto-generated method stub
}
},list);
(3)post只上传文件
filekeys 是上传文件的键值数组
filePaths 是文件路径的数组
NetLoader.getInstance().loadPostFilesData(url,filekeys, filePaths, new NetResponseListener() {
@Override
publicvoid success(String resultString) {
//TODO Auto-generated method stub
}
@Override
publicvoid fail(String failString, Exception e) {
//TODO Auto-generated method stub
}
});
(4)post上传文件病携带参数(有小瑕疵,只能是string类型的)
NetLoader.getInstance().loadPostParamsWithFiles(url,filekeys, filePaths, new NetResponseListener() {
@Override
publicvoid success(String resultString) {
//TODO Auto-generated method stub
}
@Override
publicvoid fail(String failString, Exception e) {
//TODO Auto-generated method stub
}
},list)
(5)匆忙设置cookie
注意事项:
如果开发人员想改代码 只需要改动load。。方法里的网络请求即可
github:https://github.com/nanchaodong/-
package com.wolf.mirror.utils;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import org.apache.http.message.BasicNameValuePair;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.FormEncodingBuilder;
import com.squareup.okhttp.MediaType;
import com.squareup.okhttp.MultipartBuilder;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;
public class NetLoader {
private static final MediaType MEDIA_TYPE_PNG = MediaType
.parse("image/png");
public static final MediaType JSON = MediaType
.parse("application/json; charset=utf-8");
private static NetLoader mInstance;
/**
* 多次网络请求的类型 这里先默认先进先出,在初始化的时候可以进行重置
*/
private Type type = Type.FIFO;
/**
* 线程池
*/
private ExecutorService mThreadPool;
/**
* 设置默认线程数为1
*/
private static final int DEFAULT_THREAD_COUNT = 1;
/**
* 后台轮询线程
*/
private Thread mPoolThread;
private LinkedList<Runnable> mTaskQueue;
/**
* 创建ui线程的handler
*/
private Handler UIhandler;
/**
* 创建子线程的handler
*/
private Handler childHandler;
/**
* 这里使用的是okhttp
*
*/
private OkHttpClient client;
private Map<String, NetResponseListener> listeners;
/**
* 定义管理子线程中handler的信量化
*/
private Semaphore mSemaphoreChildHander = new Semaphore(0);;
/**
* 定义管理线程池的信量化
*/
private Semaphore mSemaphoreThreadPool;
/**
* 一下为uihandler的所用的常量
*/
private static final int UI_GET_FAILED = 0X100;
private static final int UI_POST_FAILED = 0X101;
private static final int UI_POST_FILE_FAILED = 0X102;
private static final int UI_POST_PARAS_FILE_FAILED = 0X103;
private static final int UI_POST_COOKIE_FAILE = 0x104;
private static final int UI_GET_SUCCED = 0x110;
private static final int UI_POST_SUCCED = 0X111;
private static final int UI_POST_FILE_SUCCED = 0X112;
private static final int UI_POST_PARAS_FILE_SUCCED = 0X113;
private static final int UI_POST_COOKIE_SUCCED = 0X115;
private static final int CHILD_MES = 0x114;
/**
* 以下为具体代码
* ********************************************************************/
public enum Type {
FIFO, LIFO
}
public interface NetResponseListener {
void success(String resultString);
void fail(String failString, Exception e);
}
private NetLoader(int threadCount, Type type) {
init(threadCount, type);
}
/**
* 初始化方法
*
* @param threadCount
* @param type2
*/
private void init(int threadCount, Type type) {
mSemaphoreThreadPool = new Semaphore(threadCount);
mPoolThread = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Looper.prepare();
childHandler = new Handler() {
public void handleMessage(Message msg) {
mThreadPool.execute(getTask());
try {
mSemaphoreThreadPool.acquire();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
mSemaphoreChildHander.release();// 在此通知handler初始化完毕
Looper.loop();
}
});
mPoolThread.start();
mThreadPool = Executors.newFixedThreadPool(threadCount);
mTaskQueue = new LinkedList<Runnable>();
listeners = new HashMap<String, NetLoader.NetResponseListener>();
this.type = type;
client = new OkHttpClient();
UIhandler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case UI_GET_FAILED:// GET网络数据加载失败
failData(msg);
break;
case UI_POST_FILE_FAILED:// post上传文件失败
failData(msg);
break;
case UI_POST_FAILED:// post请求失败
failData(msg);
break;
case UI_POST_PARAS_FILE_FAILED:// post上传文件和参数失败
failData(msg);
break;
case UI_POST_COOKIE_FAILE:
failData(msg);
break;
case UI_GET_SUCCED:// get请求加载成功
sucData(msg);
break;
case UI_POST_FILE_SUCCED:// 上传文件成功
sucData(msg);
break;
case UI_POST_PARAS_FILE_SUCCED:// 上传文件以及携带参数成功
sucData(msg);
break;
case UI_POST_SUCCED:// post请求成功
sucData(msg);
break;
case UI_POST_COOKIE_SUCCED:
sucData(msg);
break;
default:
break;
}
};
};
}
/****************************************************************/
/**
* 数据成功的回调
*
* @param message
*/
private void sucData(Message message) {
if (message != null) {
SucHolder holder = (SucHolder) message.obj;
String url = holder.url;
String result = holder.result;
if (listeners.containsKey(url)) {
NetResponseListener listener = listeners.get(url);
listener.success(result);
}
listeners.remove(url);
}
}
private void failData(Message message) {
if (message != null) {
FailHolder holder = (FailHolder) message.obj;
String url = holder.url;
String failString = holder.failString;
Exception e = holder.exception;
if (listeners.containsKey(url)) {
NetResponseListener listener = listeners.get(url);
listener.fail(failString, e);
}
listeners.remove(url);
}
}
/*********************************************************************/
/**
* 采用懒加载
*
* @return
*/
public static NetLoader getInstance() {
if (mInstance == null) {
synchronized (NetLoader.class) {
if (mInstance == null) {
mInstance = new NetLoader(DEFAULT_THREAD_COUNT, Type.LIFO);
}
}
}
return mInstance;
}
/**
* 可以用此方法现在application中初始化
*
* @param threadCount
* @param type
* @return
*/
public static NetLoader getInstance(int threadCount, Type type) {
if (mInstance == null) {
synchronized (NetLoader.class) {
if (mInstance == null) {
mInstance = new NetLoader(threadCount, type);
}
}
}
return mInstance;
}
/**
* 加载get请求
*
* @param url
*/
public void loadGetData(final String url, NetResponseListener listener) {
listeners.put(url, listener);
addTask(new Runnable() {
public void run() {
Request request = new Request.Builder().url(url).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onResponse(Response arg0) throws IOException {
String result = getResponseString(arg0);
Message message = getSucMessage(url, result,
UI_GET_SUCCED);
UIhandler.sendMessage(message);
}
@Override
public void onFailure(Request arg0, IOException arg1) {
String failString = getFailedString(arg0);
Message message = getFailMessage(url, failString, arg1,
UI_GET_SUCCED);
UIhandler.sendMessage(message);
}
});
mSemaphoreThreadPool.release();
}
});
}
/**
* 加载普通post请求
*/
public void loadOrdinaryPostData(final String url,
NetResponseListener listener, final List<BasicNameValuePair> list) {
String urlString = "";
for (BasicNameValuePair basicNameValuePair : list) {
urlString += basicNameValuePair.getName() + "=" + basicNameValuePair.getValue() + "&";
}
urlString = url + urlString;
final String str = urlString;
listeners.put(str, listener);
addTask(new Runnable() {
@Override
public void run() {
FormEncodingBuilder builder = new FormEncodingBuilder();
if (list != null && list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
BasicNameValuePair pairs = list.get(i);
builder.add(pairs.getName(), pairs.getValue());
}
}
if (builder != null) {
Request request = new Request.Builder().url(url)
.post(builder.build()).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onResponse(Response arg0)
throws IOException {
String result = getResponseString(arg0);
Message message = getSucMessage(str, result,
UI_POST_SUCCED);
UIhandler.sendMessage(message);
}
@Override
public void onFailure(Request arg0, IOException arg1) {
String failString = getFailedString(arg0);
Message message = getFailMessage(str,failString, arg1,
UI_POST_FAILED);
UIhandler.sendMessage(message);
}
});
}
mSemaphoreThreadPool.release();
}
});
}
/**
* 上传文件的post请求
*/
public void loadPostFilesData(final String url, final String[] filekeys,
final String[] filePaths, NetResponseListener listener) {
String urlString = "";
for (int i = 0; i < filePaths.length; i++) {
urlString += filekeys[i] + "=" + filePaths[i] + "&";
}
final String str =url + urlString;
listeners.put(str, listener);
addTask(new Runnable() {
@Override
public void run() {
MultipartBuilder builder = new MultipartBuilder();
builder.type(MultipartBuilder.FORM);
if (filePaths.length > 0 && filekeys.length > 0
&& (filekeys.length == filePaths.length)) {
File[] files = new File[filePaths.length];
for (int i = 0; i < filePaths.length; i++) {
files[i] = new File(filePaths[i]);
builder.addFormDataPart(filekeys[i], filePaths[i],
RequestBody.create(MEDIA_TYPE_PNG, files[i]));
}
}
if (builder != null) {
Request request = new Request.Builder().url(url)
.post(builder.build()).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onResponse(Response arg0)
throws IOException {
String result = getResponseString(arg0);
Message message = getSucMessage(str, result,
UI_POST_FILE_SUCCED);
UIhandler.sendMessage(message);
}
@Override
public void onFailure(Request arg0, IOException arg1) {
String failString = getFailedString(arg0);
Message message = getFailMessage(str,failString, arg1,
UI_POST_FILE_FAILED);
UIhandler.sendMessage(message);
}
});
}
mSemaphoreThreadPool.release();
}
});
}
/**
* 上传文件的post请求以及携带参数
*/
public void loadPostParamsWithFiles(final String url,
final String[] filekeys, final String[] filePaths,
NetResponseListener listener, final List<BasicNameValuePair> list) {
String urlString = "";
for (BasicNameValuePair basicNameValuePair : list) {
urlString += basicNameValuePair.getName() + "=" + basicNameValuePair.getValue() + "&";
}
urlString = url + urlString;
final String str = urlString;
listeners.put(str, listener);
addTask(new Runnable() {
@Override
public void run() {
MultipartBuilder builder = new MultipartBuilder();
builder.type(MultipartBuilder.FORM);
if (list != null && list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
BasicNameValuePair pairs = list.get(i);
builder.addFormDataPart(pairs.getName(),
pairs.getValue());
}
}
if (filePaths.length > 0 && filekeys.length > 0
&& (filekeys.length == filePaths.length)) {
File[] files = new File[filePaths.length];
for (int i = 0; i < filePaths.length; i++) {
files[i] = new File(filePaths[i]);
builder.addFormDataPart(filekeys[i], filePaths[i],
RequestBody.create(MEDIA_TYPE_PNG, files[i]));
}
}
if (builder != null) {
Request request = new Request.Builder().url(url)
.post(builder.build()).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onResponse(Response arg0)
throws IOException {
String result = getResponseString(arg0);
Message message = getSucMessage(str, result,
UI_POST_PARAS_FILE_SUCCED);
UIhandler.sendMessage(message);
}
@Override
public void onFailure(Request arg0, IOException arg1) {
String failString = getFailedString(arg0);
Message message = getFailMessage(str,failString, arg1,
UI_POST_PARAS_FILE_FAILED);
UIhandler.sendMessage(message);
}
});
}
mSemaphoreThreadPool.release();
}
});
}
/**
* post上传携带cookie
*
* @param url
* @param json
* @param cookiekey
* @param cookie
* @param listener
*/
public void loadPostDataWithCokkie(final String url, final String json,
final String cookiekey, final String cookie,
NetResponseListener listener) {
final String str = url + json;
listeners.put(str, listener);
addTask(new Runnable() {
@Override
public void run() {
RequestBody body = RequestBody.create(JSON, json);
Request request = new Request.Builder()
.header(cookiekey, cookie).url(url).post(body).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onResponse(Response arg0) throws IOException {
// TODO Auto-generated method stub
String result = getResponseString(arg0);
Message message = getSucMessage(str, result,
UI_POST_COOKIE_SUCCED);
UIhandler.sendMessage(message);
}
@Override
public void onFailure(Request arg0, IOException arg1) {
// TODO Auto-generated method stub
String failString = getFailedString(arg0);
Message message = getFailMessage(str,failString, arg1,
UI_POST_COOKIE_FAILE);
UIhandler.sendMessage(message);
}
});
mSemaphoreThreadPool.release();
}
});
}
/**
* 添加任务到队列中
*
* @param runnable
* 加同步锁以防线程并发
*/
private synchronized void addTask(Runnable runnable) {
mTaskQueue.add(runnable);
if (childHandler == null) {// 如果子线程的中handler为空 那么等待handler初始化
try {
mSemaphoreChildHander.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
childHandler.sendEmptyMessage(CHILD_MES);
}
/**
* 从任务中取出任务
*
* @return
*/
private Runnable getTask() {
if (type == Type.FIFO) {
return mTaskQueue.removeFirst();
} else if (type == Type.LIFO) {
return mTaskQueue.removeLast();
}
return null;
};
/**
* 将返回的response转成String
*
* @param response
* @return
* @throws IOException
*/
private String getResponseString(Response response) throws IOException {
if (response != null) {
return response.body().string();
}
return null;
}
/**
* 将失败的request转化成String
*
* @param request
* @return
*/
private String getFailedString(Request request) {
if (request != null) {
return request.body().toString();
}
return null;
}
/**
* 得到成功的message
*
* @param result
* @param code
* @return
*/
private Message getSucMessage(String url, String result, int code) {
if (result != null && code != -1) {
Message message = Message.obtain();
message.obj = getSucHolder(url, result);
message.what = code;
return message;
}
return null;
}
/**
* 得到失败的message
*
* @param failString
* @param e
* @param code
* @return
*/
private Message getFailMessage(String url,String failString, IOException e, int code) {
if (failString != null && e != null && code != -1) {
Message message = Message.obtain();
message.what = code;
message.obj = getFailHolder(url, failString, e);
return message;
}
return null;
}
/**
* 得到失败的holder对象
*
* @param failString
* @param e
* @return
*/
private FailHolder getFailHolder(String url, String failString, IOException e) {
if (failString != null && e != null) {
FailHolder holder = new FailHolder();
holder.exception = e;
holder.failString = failString;
holder.url = url;
return holder;
}
return null;
}
/**
* 得到成功的holder对象
*
* @param url
* @param result
* @return
*/
private SucHolder getSucHolder(String url, String result) {
if (url != null && result != null) {
SucHolder holder = new SucHolder();
holder.result = result;
holder.url = url;
return holder;
}
return null;
}
/**
* 失败缓存
*
* @author nanchaodong
*
*/
private class FailHolder {
String failString;
Exception exception;
String url;
}
/**
* 成功缓存
*
* @author nanchaodong
*
*/
private class SucHolder {
String url;
String result;
}
}