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);
}
}
}
此處將響應分發結合進來,使用回調完成請求數據的傳遞。