Android---构建一个自己的网络框架以及源码
第二,消息队列
消息队列可以是轮询或者其他算法下的消息列表,也可以使用线程池,在这里我们使用线程池来实现。
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 20, 1,
TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(3),
new ThreadPoolExecutor.CallerRunsPolicy());
public void addTask(Runnable runnable) {
if (runnable != null)
threadPoolExecutor.execute(runnable);
}
其中ThreadPoolExecutor提供了四个构造方法:
主要参数见下表:
、
第三,构建线程执行内容
public TextMessageProcess addProcess(Context context, RequestBean request,
ProcessListener processListener, int se) {
TextMessageProcess run = null;
try {
String requestKey = request.getRequestKey();
run = new TextMessageProcess(context, requestKey,
Address.getUrl(requestKey), request.getRequestStr(),
request.getMessageParser(), processListener, se);
} catch (Exception e) {
e.printStackTrace();
}
addTask(run);
return run;
}
public TextMessageGetJsonProcess addGetJsonProcess(Context context, RequestBean request,
ProcessListener processListener, int se) {
TextMessageGetJsonProcess run = null;
try {
String requestKey = request.getRequestKey();
run = new TextMessageGetJsonProcess(context, requestKey,
Address.getUrl(requestKey), request.getRequestStr(),
request.getMessageParser(), processListener, se);
} catch (Exception e) {
e.printStackTrace();
}
addTask(run);
return run;
}
public TextMessageXMLProcess addXMLProcess(Context context, RequestBean request,
ProcessListener processListener, int se) {
TextMessageXMLProcess run = null;
try {
String requestKey = request.getRequestKey();
run = new TextMessageXMLProcess(context, requestKey,
Address.getUrl(requestKey), request.getRequestStr(),
request.getMessageParser(), processListener, se);
} catch (Exception e) {
e.printStackTrace();
}
addTask(run);
return run;
}
其中TextMessageProcess是实现Runnable的实例:
public class TextMessageProcess implements Runnable {
private Context context;
private String url;
private String request;
private String response;
private ResponseBean responseBean;
private TextMessageParser parser;
private String requestKey;
private ProcessListener processListener;
private int netReadSecond = 1;
public TextMessageProcess(Context context, String requestKey, String url,
String request, TextMessageParser parser,
ProcessListener processListener) {
this(context, requestKey, url, request, parser, processListener, 1);
}
public TextMessageProcess(Context context, String requestKey, String url,
String request, TextMessageParser parser,
ProcessListener processListener, int netReadSecond) {
super();
this.context = context;
this.url = url;
this.request = request;
this.parser = parser;
this.requestKey = requestKey;
this.processListener = processListener;
this.netReadSecond = netReadSecond;
}
public void run() {
NetworkManager manager = new NetworkManager(context, netReadSecond);
response = manager.SendAndWaitResponse(request, url);
Global.debug("response:"+response);
if (processListener == null) {
Global.debug("processListener can not be null");
return;
}
if (response == null || response.equals("null") || response.equals("")) {
responseBean = new ResponseBean();
responseBean.setRequestKey(requestKey);
responseBean.setResponseCode(ResponseBean.RESP_NET_ERROR);
processListener.onDone(responseBean);
return;
}
if (parser == null) {
responseBean = new ResponseBean();
responseBean.setRequestKey(requestKey);
responseBean.setResponseCode(ResponseBean.RESP_PARSER_ERROR);
processListener.onDone(responseBean);
return;
}
responseBean = (ResponseBean) parser.parser(response);
if (responseBean == null) {
responseBean = new ResponseBean();
responseBean.setRequestKey(requestKey);
responseBean.setResponseCode(ResponseBean.RESP_PARSER_ERROR);
processListener.onDone(responseBean);
return;
} else {
responseBean.setRequestKey(requestKey);
processListener.onDone(responseBean);
}
}
}
此处将响应分发结合进来,使用回调完成请求数据的传递。