Android项目-高考作文-AsyncTask的不足
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的不足的更多相关文章
- Android项目-高考作文功能简介(一)
前言 : 开发安卓也已2年多了近3年了, 在自己刚入行的时候就有自己独立开发一个App的想法. 后来自己做了<<高考作文>>这一App. 后面续续断断的维护者. 也因为功能简 ...
- Android项目-高考作文项目架构(二)
1, 普通的http json请求 请看下面架构草图: 这样就抽象出了其他Activity可能需要的Http Json请求的功能. 只要其他Activity有Http Json请求的需求都可以继承Ba ...
- Android项目-高考作文-使用ORMLite抽象公共的Dao层
1, 定义统一的Dao接口 public interface IDao<T> { public abstract T getSingleById(int id); public abstr ...
- Android项目-高考作文-抽象BaseAdapter
1, 在使用baseAdapter的时候,总是有需要重复的代码如: @Override public int getCount() { return list.size(); } @Override ...
- Android项目-高考作文项目架构(三)
上一篇我们讲到了, Http Json的功能的抽取. 如果我们请求的是一个列表的数据呢? 我们使用那个功能就不是很好. 因为一个列表, 还有很多其他功能(比如每个listView都需要setAdap ...
- (转)Android项目重构之路:实现篇
前两篇文章Android项目重构之路:架构篇和Android项目重构之路:界面篇已经讲了我的项目开始搭建时的架构设计和界面设计,这篇就讲讲具体怎么实现的,以实现最小化可用产品(MVP)的目标,用最简单 ...
- (转载)Android项目实战(二十八):使用Zxing实现二维码及优化实例
Android项目实战(二十八):使用Zxing实现二维码及优化实例 作者:听着music睡 字体:[增加 减小] 类型:转载 时间:2016-11-21我要评论 这篇文章主要介绍了Android项目 ...
- (转载) android项目大全,总有你所需的
目录视图 摘要视图 订阅 赠书 | 异步2周年,技术图书免费选 程序员8月书讯 项目管理+代码托管+文档协作,开发更流畅 [置顶] android项目大全,总有你所需的 标签: 源 ...
- Android 项目优化(七):阿里巴巴Android开发手册整理总结
本来之前觉得Android项目优化系列的文章基本整理完毕了,但是近期看了一下<阿里Android开发手册>有了很多收获,想再整理一篇,下面就开始吧. 先在这里列一下之前整理的文章及链接: ...
随机推荐
- Log4j使用详解
1 Log4j配置说明 1.1 配置文件Log4j可以通过java程序动态设置,该方式明显缺点是:如果需要修改日志输出级别等信息,则必须修改java文件,然后重新编译,很是麻烦: log4j也可以通过 ...
- nginx 网络模型,cpu亲和等优点
nginx优点1.IO多路复用epollIO多路复用:多个描述符的I/O操作都能在一个线程内并发交替地顺序完成,这里的"复用" 指的是复用同一个线程epollIO多路复用的实现方式 ...
- vuex存储和本地存储(localstorage、sessionstorage)的区别
1.最重要的区别:vuex存储在内存,localstorage则以文件的方式存储在本地 2.应用场景:vuex用于组件之间的传值,localstorage则主要用于不同页面之间的传值. 3.永久性:当 ...
- PHP使用prepare(),insert数据时要注意的一点!!!
今天看了PHP防SQL注入,使用预处理prepare,但是我insert数据时,总是插不进去,但是select却可以,弄了很久终于知道原来问题在这里,先上代码 <?php header('con ...
- SpringMVC之简单的增删改查示例(SSM整合)
本篇文章主要介绍了SpringMVC之简单的增删改查示例(SSM整合),这个例子是基于SpringMVC+Spring+Mybatis实现的.有兴趣的可以了解一下. 虽然已经在做关于SpringMVC ...
- redis和spring集成
redis和spring框架的整合 我这里创建的是maven工程,通过maven锁定版本号,管理jar包之间的依赖 1.在pom文件中,引入spring和redis的jar包的坐标: <prop ...
- centos 6安装opencv
昨天装好的,今天有些细节已经记不起来里,大致写一下吧. 首先,从opencv官网下载linux的opencv-2.4.9安装包,下载地址:http://jaist.dl.sourceforge.net ...
- C#基础拾遗系列之二:C#7.0新增功能点
第一部分: C#是一种通用的,类型安全的,面向对象的编程语言.有如下特点: (1)面向对象:c# 是面向对象的范例的一个丰富实现, 它包括封装.继承和多态性.C#面向对象的行为包括: 统一的类型系统 ...
- Spring中配置DataSource的六种方式
第一种:beans.xml <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource ...
- iOS开源加密相册Agony的实现(六)
简介 虽然目前市面上有一些不错的加密相册App,但不是内置广告,就是对上传的张数有所限制.本文介绍了一个加密相册的制作过程,该加密相册将包括多密码(输入不同的密码即可访问不同的空间,可掩人耳目).Wi ...