1, AsyncTask的不足.

从android4.0开始, 后台只允许一个AsyncTask执行, 如果当前的AsyncTask没有执行完毕, 那么当前的请求一直处于等待状态. 直到上一个执行完毕. 并且还不能停止上一个AsyncTask. 但是为了快速响应应用的请求, 我们需要多个任务并行执行.

2, 基于AsyncTask的源码 改写自己的AsyncTask.

public abstract class AsyncTaskCustomize<Params, Result> {

	private static final int MESSAGE_POST_RESULT = 0;
	private Thread thread;
	private InternalHandler mHandler = new InternalHandler();
	private final AtomicBoolean mCancelled = new AtomicBoolean();
	private volatile Status mStatus = Status.PENDING;
	private WorkerRunnable<Params, Result> work;

	protected int key;

	public AsyncTaskCustomize(int key) {
		this.key = key;
		work = new WorkerRunnable<Params, Result>() {
			@Override
			public void run() {
				Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
				postResult(doInBackground(mParams));
			}
		};
		thread = new Thread(work);
	}

	public final boolean isCancelled() {
		return mCancelled.get();
	}

	private void postResult(Result result) {
		@SuppressWarnings("unchecked")
		Message message = mHandler.obtainMessage(MESSAGE_POST_RESULT,
				new AsyncTaskResult<Result>(this, result));
		message.sendToTarget();
		// return result;
	}

	public final AsyncTaskCustomize<Params, Result> execute(Params... params) {
		return executeTask(params);
	}

	/**
	 * @param params
	 */
	private AsyncTaskCustomize<Params, Result> executeTask(Params... params) {
		if (mStatus != Status.PENDING) {
			switch (mStatus) {
			case RUNNING:
				throw new IllegalStateException("Cannot execute task:"
						+ " the task is already running.");
			case FINISHED:
				throw new IllegalStateException("Cannot execute task:"
						+ " the task has already been executed "
						+ "(a task can be executed only once)");
			default:
				break;
			}
		}
		onPreExecute();
		work.mParams = params;
		mStatus = Status.RUNNING;
		thread.start();
		return this;
	}

	/**
	 * must add super.onPreExecute(result);
	 */
	public void onPreExecute() {
		TaskController.getInstance().add(key, this);
	}

	/**
	 * must add super.onPostExecute(result);
	 */
	public void onPostExecute(Result result) {
		TaskController.getInstance().remove(key);
	}

	public abstract Result doInBackground(Params... params);

	private static final class InternalHandler extends Handler {
		@SuppressWarnings("unchecked")
		@Override
		public void handleMessage(Message msg) {
			@SuppressWarnings("rawtypes")
			AsyncTaskResult result = (AsyncTaskResult) msg.obj;
			switch (msg.what) {
			case MESSAGE_POST_RESULT:
				// There is only one result
				result.mTask.finish(result.mData[0]);
				break;
			}
		}
	}

	private void finish(Result result) {
		if (isCancelled()) {
			onCancelled(result);
		} else {
			onPostExecute(result);
		}
		mStatus = Status.FINISHED;
	}

	public final boolean cancel() {
		if (isCancelled()) {
			return false;
		}
		if (mStatus == Status.FINISHED) {
			return false;
		}
		try {
			thread.interrupt();
			mCancelled.set(true);
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}

	/**
	 * @param result
	 */
	protected void onCancelled(Result result) {

	}

	protected void onCancelled() {
	}

	private static abstract class WorkerRunnable<Params, Result> implements
			Runnable {
		Params[] mParams;
	}

	public enum Status {
		/**
		 * Indicates that the task has not been executed yet.
		 */
		PENDING,
		/**
		 * Indicates that the task is running.
		 */
		RUNNING,
		/**
		 * Indicates that {@link AsyncTask#onPostExecute} has finished.
		 */
		FINISHED,
	}

	@SuppressWarnings("rawtypes")
	private static class AsyncTaskResult<Data> {
		final AsyncTaskCustomize mTask;
		final Data[] mData;

		AsyncTaskResult(AsyncTaskCustomize task, Data... data) {
			mTask = task;
			mData = data;
		}
	}
}

Android项目-高考作文-AsyncTask的不足的更多相关文章

  1. Android项目-高考作文功能简介(一)

    前言 :  开发安卓也已2年多了近3年了, 在自己刚入行的时候就有自己独立开发一个App的想法. 后来自己做了<<高考作文>>这一App. 后面续续断断的维护者. 也因为功能简 ...

  2. Android项目-高考作文项目架构(二)

    1, 普通的http json请求 请看下面架构草图: 这样就抽象出了其他Activity可能需要的Http Json请求的功能. 只要其他Activity有Http Json请求的需求都可以继承Ba ...

  3. Android项目-高考作文-使用ORMLite抽象公共的Dao层

    1, 定义统一的Dao接口 public interface IDao<T> { public abstract T getSingleById(int id); public abstr ...

  4. Android项目-高考作文-抽象BaseAdapter

    1, 在使用baseAdapter的时候,总是有需要重复的代码如: @Override public int getCount() { return list.size(); } @Override ...

  5. Android项目-高考作文项目架构(三)

    上一篇我们讲到了,  Http Json的功能的抽取. 如果我们请求的是一个列表的数据呢? 我们使用那个功能就不是很好. 因为一个列表, 还有很多其他功能(比如每个listView都需要setAdap ...

  6. (转)Android项目重构之路:实现篇

    前两篇文章Android项目重构之路:架构篇和Android项目重构之路:界面篇已经讲了我的项目开始搭建时的架构设计和界面设计,这篇就讲讲具体怎么实现的,以实现最小化可用产品(MVP)的目标,用最简单 ...

  7. (转载)Android项目实战(二十八):使用Zxing实现二维码及优化实例

    Android项目实战(二十八):使用Zxing实现二维码及优化实例 作者:听着music睡 字体:[增加 减小] 类型:转载 时间:2016-11-21我要评论 这篇文章主要介绍了Android项目 ...

  8. (转载) android项目大全,总有你所需的

    目录视图 摘要视图 订阅 赠书 | 异步2周年,技术图书免费选      程序员8月书讯      项目管理+代码托管+文档协作,开发更流畅 [置顶] android项目大全,总有你所需的 标签: 源 ...

  9. Android 项目优化(七):阿里巴巴Android开发手册整理总结

    本来之前觉得Android项目优化系列的文章基本整理完毕了,但是近期看了一下<阿里Android开发手册>有了很多收获,想再整理一篇,下面就开始吧. 先在这里列一下之前整理的文章及链接: ...

随机推荐

  1. Mysql优化--慢查询日志

    Mysql 系列文章主页 =============== 默认没有开启慢查询日志功能.如果不是调优需要的话,一般不建议开启. 查看是否开启慢查询日志: SHOW VARIABLES LIKE '%sl ...

  2. selenium登录163邮箱

    环境:windows8  python2.7+selenium+chrome 直接上脚本: # coding=utf-8from selenium import webdriverimport tim ...

  3. mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法

    [CSDN下载] Powerdesigner 设计主键code不能重复等问题 [CSDN博客] Oracle中用一个序列给两个表创建主键自增功能的后果 [CSDN博客] MySQL自增主键删除后重复问 ...

  4. logback学习二

    转载:https://www.cnblogs.com/DeepLearing/p/5663178.html 属性 : debug : 默认为false ,设置为true时,将打印出logback内部日 ...

  5. manjaro备忘录

    updated 2018/4/3 manjaro 使用Linux发行版时需要注意几个方面的问题: 包管理器 包管理器无疑时各家发行版的最大特色之一.软件同时也是一个平台是否能够产生足够的吸引力的来源之 ...

  6. [转]关于OpenGL的绘制上下文

    [转]关于OpenGL的绘制上下文 本文转自(http://www.cnblogs.com/Liuwq/p/5444641.html) 什么是绘制上下文(Rendering Context) 初学Op ...

  7. 剑指架构师系列-Redis集群部署

    初步搭建Redis集群 克隆已经安装Redis的虚拟机,我们使用这两个虚拟机中的Redis来搭建集群. master:192.168.2.129 端口:7001 slave:192.168.2.132 ...

  8. Ubuntu 16.04: How to resolve libqt5x11extras5 (>= 5.1.0) but it is not going to be installed

    Issue: When you install Virtualbox 5.1 on Ubuntu 16.04, you may encounter following error: root@XIAY ...

  9. 用Matlab画直方图

    简介 本文介绍如何使用matlab定制自己的直方图. 关键 使用Matlab的 bar() 函数创建柱状图 bar() 画的bin的高度跟数据相关 bar() 数据每一列一个group,有几列数据就画 ...

  10. 好IT男不能“淫”-谈IT人员目前普遍存在的“A情绪”

    <如果当道德无法约束你的时候...那么就让对疾病的恐惧来制约你吧> 前言 在写这篇文章前我的心情无比的沉重.几次提笔欲写,几次又未能完成,可是最终让我"奋笔疾书"的原因 ...