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. MyBatis 传入参数之parameterType

      在MyBatis的select,insert,update,delete这些元素中都提到了parameterType这个属性.MyBatis现在使用parameterType有基本类型和JAVA复 ...

  2. Enum枚举

    Java Enum原理 public enum Size{ SMALL, MEDIUM, LARGE, EXTRA_LARGE }; 实际上,这个声明定义的类型是一个类,它刚好有四个实例,在此尽量不要 ...

  3. 补充Mysql5.7用法

    下面简单介绍一下安装: [root@MySQL soft]# tar xf mysql-5.7.10-linux-glibc2.5-x86_64.tar.gz -C /data/service/ [r ...

  4. angular 路由的引用

    使用angular路由 遇到的坑. 使用cmd 安装好node.js 安装成功 输入node  -v 能查看版本说明安装成功 搭建angular项目输入命令 npm install  -g  angu ...

  5. nginx的yum安装,基本参数使用,编译参数说明和Nginx基本配置,模块安装

    nginx的yum安装从nginx官网获取源 vim /etc/yum.repose.d/nginx.repo[nginx]name=nginx repobaseurl=http://nginx.or ...

  6. ajax跨域请求问题及解决办法总结

    1.浏览器的同源策略及规避方法 目前,所有浏览器都实行同源政策.即协议.域名.端口都相同的URI称为"同源".不同源的url之间: a.无法读取cookie.localstorag ...

  7. Spring + mybatis 集成

    具体项目可参照:https://github.com/LuoXiaoyi/springmvc 一.环境准备:Spring4.3.5 + Mybatis3.4.6 + Mybatis-Spring 1. ...

  8. hive指定hadoop执行队列

    指定队列的命令: 有三种: set mapred.job.queue.name=queue3; SET mapreduce.job.queuename=queue3; set mapred.queue ...

  9. Swift 3中新的访问控制关键字fileprivate和open

    在Swift 3中除去原有的3个访问控制关键字private,public,internal,又添加了2个关键字fileprivate和open 它们可以看成是对private和public的进一步细 ...

  10. Most Common Solutions to FRM-41839 and .tmp Files Not Being Deleted

    In this Document   Symptoms   Changes   Cause   Solution   References APPLIES TO: Oracle Application ...