Android---構建一個自己的網絡框架(三)

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);
		}
	}

}

此處將響應分發結合進來,使用回調完成請求數據的傳遞。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章