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

}

此处将响应分发结合进来,使用回调完成请求数据的传递。

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