学以致用--链式结构处理android耗时请求

学以致用--链式结构处理android耗时请求

1:背景

今天遇到了一个情况(首先需要去http请求获取服务器数据,然后将数据存库,其次再将数据的一部分放入share文件,最后更新内存数据.....)
哎,最后一步更新内存还行,非常速度的,前面散步基本是基本包括了android中耗时操作的三个大类吧,哎---是在不想一步一步整

2:知识前提

大概了解程序的设计模式(本文采用责任链模式),有一点点开发经验就ok了哈

3:程序基本模型

一个请求类 Responser, 一个请求执行类ResponserChain,一个 HttpUtils工具类,一个数据库工具类databaseutils,一个share文件工具类shareutils

Responser代码如下:

public abstract class Responser<T> {

	public final int	CONS_TIME_OUT_ONE_SECOND		= 1000;
	private final int	CONS_TIME_OUT_SIXTEEN_SECOND	= 60 * CONS_TIME_OUT_ONE_SECOND;	// 10秒

	public Responser(int weight) {
		this.thisWeight = weight;
		this.ResponserKey = String.valueOf(hashCode());
	}

	public String	ResponserKey;<span style="white-space:pre">	</span>//唯一标识一个任务
	public int		thisWeight	= Integer.MAX_VALUE;  //该请求的权重

	protected T		t;

	public int timeOut() {
		return CONS_TIME_OUT_SIXTEEN_SECOND;
	}

	/**
	 * 依次执行任务的时候,如果下一个任务需要上一次执行的返回结果,在这里设置
	 * 
	 * @param ob
	 */
	public void doNext(JSONObject ob) {
	}

	/**
	 * 依次执行任务的时候,如果下一个任务需要上一次执行的返回结果,在这里获取
	 * 
	 * @param ob
	 */
	public T onNext() {
		return t;
	}

	/**
	 * 执行任务
	 * 
	 * @return
	 */
	public abstract String excute();

	/**
	 * 任務類型
	 * 
	 * @return
	 */
	public abstract EResponseType resType();

	public enum EResponseType {
		DATABASE, HTTP, SHARE
	}
}

注意以上的一个excute的方法,每个请求类均有该方法执行

下面举例说明以上遇到的情况,先http请求,再入库,然后再share文件,然后内存

<pre name="code" class="java">final Responser<String> http= new Responser<String>(0) {

			@Override
			public String excute() {
				return HttpUtils.get(......);//省略号是请求地址
			}
		};
<pre name="code" class="java">final Responser<String> db= new Responser<String>(1) {

			@Override
			public String excute() {
				return databaseutils.insert(......);//省略号是插入数据库代码
			}
		};

 
<pre name="code" class="java">final Responser<String> unbind = new <span style="font-family: Arial, Helvetica, sans-serif;">Responser</span><span style="font-family: Arial, Helvetica, sans-serif;"><String>(2) {</span>

			@Override
			public String excute() {
				return shareutils.commit(......);//省略号是提交share文件
			}
		};

 


 然后是执行请求的类ResponserChain: 

代码如下

public class ResponserChain {

	private Vector<Responser<?>>	allResponse			= new Vector<Responser<?>>();
	private boolean					currentChainIsAlive	= false;
	private responserChainListener	_ResChainListener;
	private Responser<?>			_Responser;

	/**
	 * Constructor one responseChain
	 */
	public ResponserChain(responserChainListener excuteListener, Responser<?>... responsers) {
		if (responsers.length <= 0) {
			return;
		}
		for (Responser<?> responser : responsers) {
			allResponse.add(responser);
		}

		currentChainIsAlive = true;
		_ResChainListener = excuteListener;
	}

	/**
	 * ready
	 */
	public boolean ready() {
		synchronized (allResponse) {
			if (allResponse.isEmpty()) {
				return false;
			}

			for (Responser<?> responser : allResponse) {
				if (_Responser == null || responser.thisWeight < _Responser.thisWeight) {
					_Responser = responser;
				}
			}
			if (_Responser == null) {
				return false;
			}
			for (Responser<?> responser : allResponse) {
				if (responser.ResponserKey.equals(_Responser.ResponserKey)) {
					allResponse.remove(responser);
					break;
				}
			}
			return _Responser.thisWeight != Integer.MAX_VALUE;
		}
	}

	/**
	 * go,
	 */
	public void go() {

		HTTPThreadPool.getInstance().submit(new Runnable() {
			@Override
			public void run() {
				/**
				 * 必须保证以下代码执行的每一句的顺序
				 */
				final String _task = _Responser.ResponserKey;
				final int _timeout = _Responser.timeOut();
				new Thread(new Runnable() {
					@Override
					public void run() {

						for (int i = _timeout; i > 0; i -= _Responser.CONS_TIME_OUT_ONE_SECOND) {
							// 如果在计算超时的时候,改任务已经执行结束,则結束超時
							if (!currentChainIsAlive || !_Responser.ResponserKey.equals(_task)) {
								return;
							}
							try {
								Thread.sleep(1050); // 为什么是1050呢--猜
							}
							catch (Exception e) {
							}
						}
						if (currentChainIsAlive && _Responser.ResponserKey.equals(_task)) {
							if (_ResChainListener != null) {
								_ResChainListener.onExcuteChainCallBack(HttpConstans.HTTP_TIMEOUT, _Responser, null);
							}
							release();
						}
					}
				}).start();

				String result = _Responser.excute();
				// 执行完成,但是职责链已经不存在
				if (!currentChainIsAlive) {
					return;
				}
				JSONObject json = null;
				try {
					if (!TextUtils.isEmpty(result)) {
						json = new JSONObject(result);
					}
				}
				catch (JSONException e) {
					json = null;
				}
				if (json == null) {
					if (_ResChainListener != null) {
						_ResChainListener.onExcuteChainCallBack(HttpConstans.HTTP_FAILED, _Responser, null);
					}
					release();
					return;
				}
				final int code = json.optInt("code");
				if (_ResChainListener != null) {
					_ResChainListener.onExcuteChainCallBack(code, _Responser, json);
				}
				_Responser.thisWeight = Integer.MAX_VALUE;
				boolean hasNext = ready();

				if (hasNext) {
					_Responser.doNext(json);
				}
				if (code == 0 && hasNext) {
					go();
					return;
				}
				release();
			}
		});
	}

	/**
	 * cut current chain
	 */
	public void cut() {
		release();
	}

	/**
	 * current chain is alive
	 */
	public boolean isAlive() {
		return currentChainIsAlive;
	}

	/**
	 * dynamic add one response, but this response is excute lase
	 */
	public boolean addResponseToLase(Responser<?>... responsers) {
		/** current chain is over, may be this object is destory */
		if (!currentChainIsAlive) {
			return false;
		}
		synchronized (allResponse) {
			for (Responser<?> responser : responsers) {
				allResponse.add(responser);
			}
		}
		return true;
	}

	/**
	 * release
	 */
	public void release() {
		currentChainIsAlive = false;
		_ResChainListener = null;
		allResponse.clear();
	}

	/**
	 * one chain excute result
	 */
	public interface responserChainListener {
		public void onExcuteChainCallBack(int result, Responser<?> responser, JSONObject json);
	}
}


最后执行你只需要这样.....

ResponserChain c = new ResponserChain(new responserChainListener() {

<span style="white-space:pre">	</span>@Override
<span style="white-space:pre">	</span>public void onExcuteChainCallBack(final int result, final Responser<?> responser, final JSONObject json) {
<span style="white-space:pre">			</span>
<span style="white-space:pre">	</span>postUI(new Runnable() {
<span style="white-space:pre">		</span>@Override
<span style="white-space:pre">		</span>public void run() {
<span style="white-space:pre">			</span>//根据返回的请求的类型,各种结果就出来了,而且是你制定的顺序   http第一执行,db第二执行,share第三执行,
<span style="white-space:pre">		</span>}, http,db,share);

if (c.ready()) {
<span style="white-space:pre">	</span>c.go();
<span style="white-space:pre">	</span>return;
}


好了,这是为了处理开发中遇到的问题,代码不是很高尚,质量也不是很好,只是给各位初学android的码友一种解决问题的方式,写得不好,各位见谅了......



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《学以致用:深入浅出数字信号处理--江志宏》这本书是一本非常好的学习数字信号处理的入门读物。本书结合实际案例,以深入浅出的方式,通过讲解数字信号的基本概念和原理,让读者了解数字信号处理的基本知识和应用。 本书主要包括以下几个方面的内容:数字信号的基本概念、数字信号的离散化、数字滤波器、数字信号处理系统的设计与实现、数字信号的快速傅里叶变换、数字信号的小波变换、数字信号处理的应用等。其中,数字滤波器是数字信号处理中最为重要的一部分,本书详细介绍了各种数字滤波器的原理以及实现方法。 本书的优点在于,对于数字信号处理的基本概念和原理进行了系统而全面的讲解,内容涉及广泛,案例丰富,实用性强,读者容易掌握。此外,作者在讲解过程中,一些难点问题进行了详细的解答和举例说明,使读者能够更加深入地理解数字信号处理。同时,本书还提供了大量的练习题和实践项目,读者可以通过实践来加深对数字信号处理的理解。 总之,本书是一本非常适合初学者阅读的数字信号处理入门读物,它不仅能够帮助读者掌握数字信号处理的基本原理,而且还能够应用数字信号处理的知识,解决实际问题,让学习达到事半功倍的效果。 ### 回答2: 《学以致用:深入浅出数字信号处理》是由江志宏著作的一本非常好的数字信号处理入门教材。这本书主要针对学习数字信号处理的人,介绍了这个领域的基础知识和应用技术。书中采用深入浅出的方法逐步讲解了数字信号的基本概念、傅里叶变换、滤波器设计以及数字信号处理中常用的算法和技术。同时,该书还提供了大量的实例和练习题,以帮助读者加深对知识的理解。 在这本书中,作者尤其关注将理论知识与实际应用相结合。他注重讲解数字信号处理在实际问题中的应用,具有很高的实用性,能够引导读者进行实际操作与应用。他还介绍了一些常用的数字信号处理软件及其应用,如MATLAB等,让读者得以更好地了解其应用方法。 此外,该书还介绍了数字信号处理在许多领域中的实际应用,如音频处理、图像处理、通信系统等,让读者了解到数字信号处理在现代科技中扮演的角色。 总的来说,该书内容丰富、实用性强,适合于数字信号处理领域的初学者。通过学习本书,读者能够深入了解数字信号处理的理论知识和技术应用,掌握数字信号处理的基本方法与技能,更好地应用数字信号处理技术解决实际问题,并为相关领域做出贡献。 ### 回答3: 江志宏的《深入浅出数字信号处理》一书以浅显易懂的方式介绍了数字信号处理的基础知识、技术和应用。书中将数字信号处理理论和数学分析与实际应用结合起来,强调“学以致用”的原则。 通过本书的学习,读者可以了解信号的基本性质、采样定理、离散傅立叶变换、数字滤波器等基本概念和方法。此外,书中还介绍了实时数字信号处理的算法和应用,包括语音信号处理、音视频的编解码、数字滤波器的设计和应用等实际问题的解决方案。 作者通过生动的案例和实际应用场景,使得读者更容易理解数字信号处理这一复杂领域的基本知识和应用。此外,书中还提供了大量的编程示例和实例代码,使得读者可以更好地理解和应用所学知识,提升编程技能。 总之,江志宏的《深入浅出数字信号处理》一书非常适合数字信号处理领域的初学者和从业者,特别是工程师和技术人员。它不仅有深入浅出的风格,还注重实际应用,能够帮助读者更好地理解数字信号处理的基本知识和应用,提升技能水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值