- 浏览: 834892 次
- 性别:
- 来自: 哈尔滨
-
文章分类
最新评论
-
doloveme:
$sudo cp MONACO_Linux.ttf /usr/ ...
terminator 的配置 -
腾讯rep:
lowser
RSA加密算法c++简单实现 -
csuhanyong:
好YD啊,好YD
一图流:机械键盘各轴区别 -
doloveme:
1。其中:extman ,extmail下载http://ww ...
Ubuntu下安装postfix+extmail邮件服务器 -
doloveme:
repo sync出现“fatal: '../platform ...
Android 编译环境配置搭建(Ubuntu 12.04)及环境导致编译错误QA
Android从1.5开始引入了AsyncTask这个类,可以帮助我们解决线程和界面刷新问题,主要是对Thread+Handler这样的封装,但在设计模式和代码维护方面都有不错的表现。对于AsyncTask的实现原理和内部的代码如何实现Android123一起和大家分享,早在2008年时Google推出了一个示例应用叫PhotoStream来演示UI在多线程网络慢速I/O下的刷新问题,里面的线程构造使用的正是AsyncTask的雏形,由于内部使用Java 1.5的并发库比普通初级Android开发者编写的Thread+Handler稳定很多,下面我们就android.os.AsyncTask的实现 public abstract class AsyncTask<Params, Progress, Result> { private static final int CORE_POOL_SIZE = 5; //线程池数量 private static final BlockingQueue<Runnable> sWorkQueue = private static final ThreadFactory sThreadFactory = new ThreadFactory() { public Thread newThread(Runnable r) { private static final ThreadPoolExecutor sExecutor = new ThreadPoolExecutor(CORE_POOL_SIZE, private static final int MESSAGE_POST_RESULT = 0x1; private static final InternalHandler sHandler = new InternalHandler(); //这个是对Handler的封装,内部处理Thread的状态。 private final WorkerRunnable<Params, Result> mWorker; //该类对Runnable做简单封装 private volatile Status mStatus = Status.PENDING; //保存当前线程状态 public enum Status { //枚举类记录当前线程状态 public AsyncTask() { mFuture = new FutureTask<Result>(mWorker) { try { message.sendToTarget(); message = sHandler.obtainMessage(MESSAGE_POST_RESULT, public final Status getStatus() { protected abstract Result doInBackground(Params... params); protected void onPreExecute() { protected void onPostExecute(Result result) { protected void onProgressUpdate(Progress... values) { protected void onCancelled() { public final boolean isCancelled() { public final boolean cancel(boolean mayInterruptIfRunning) { public final Result get() throws InterruptedException, ExecutionException { public final Result get(long timeout, TimeUnit unit) throws InterruptedException, public final AsyncTask<Params, Progress, Result> execute(Params... params) { mStatus = Status.RUNNING; onPreExecute(); mWorker.mParams = params; return this; protected final void publishProgress(Progress... values) { //通过Handler通知UI刷新 private void finish(Result result) { private static class InternalHandler extends Handler { //和我们的Handler没有什么不同 private static abstract class WorkerRunnable<Params, Result> implements Callable<Result> { @SuppressWarnings({"RawUseOfParameterizedType"}) AsyncTaskResult(AsyncTask task, Data... data) { 经过上面的简单分析相信大家对Android AsyncTask会有更加深刻的理解,整个AsyncTask实现基于Thread+Handler,但对于Thread使用的是Java的并发包的FutureTask具体的可以参考JDK5以后的源码。AsyncTask实现原理和内部代码
private static final String LOG_TAG = "AsyncTask";
private static final int MAXIMUM_POOL_SIZE = 128; //线程池中最大线程数
private static final int KEEP_ALIVE = 1;
new LinkedBlockingQueue<Runnable>(10); //使用并发库的阻塞队列初始时保存10个Runnable对象
private final AtomicInteger mCount = new AtomicInteger(1);
return new Thread(r, "AsyncTask #" + mCount.getAndIncrement());
}
};
MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sWorkQueue, sThreadFactory); //创建线程池
private static final int MESSAGE_POST_PROGRESS = 0x2;
private static final int MESSAGE_POST_CANCEL = 0x3;
private final FutureTask<Result> mFuture; //对于并发库而言FutureTask是最重要的,有兴趣的网友可以看下JDK源码
PENDING,
RUNNING,
FINISHED,
}
mWorker = new WorkerRunnable<Params, Result>() { //构造Runable对象
public Result call() throws Exception {
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); //设置线程优先级为后台,这里Android开发网提示大家低于标准线程优先级
return doInBackground(mParams);
}
};
@Override
protected void done() {
Message message;
Result result = null;
result = get();
} catch (InterruptedException e) { //处理Thread中断异常
android.util.Log.w(LOG_TAG, e);
} catch (ExecutionException e) {
throw new RuntimeException("An error occured while executing doInBackground()",
e.getCause());
} catch (CancellationException e) {
message = sHandler.obtainMessage(MESSAGE_POST_CANCEL,
new AsyncTaskResult<Result>(AsyncTask.this, (Result[]) null));
return;
} catch (Throwable t) {
throw new RuntimeException("An error occured while executing "
+ "doInBackground()", t);
}
new AsyncTaskResult<Result>(AsyncTask.this, result)); //执行完后通过Handler通知结果
message.sendToTarget();
}
};
}
return mStatus;
}
}
}
}
}
return mFuture.isCancelled();
}
return mFuture.cancel(mayInterruptIfRunning);
}
return mFuture.get();
}
ExecutionException, TimeoutException {
return mFuture.get(timeout, unit);
}
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)");
}
}
sExecutor.execute(mFuture);
}
sHandler.obtainMessage(MESSAGE_POST_PROGRESS,
new AsyncTaskResult<Progress>(this, values)).sendToTarget();
}
if (isCancelled()) result = null;
onPostExecute(result);
mStatus = Status.FINISHED;
}
@SuppressWarnings({"unchecked", "RawUseOfParameterizedType"})
@Override
public void handleMessage(Message msg) {
AsyncTaskResult result = (AsyncTaskResult) msg.obj;
switch (msg.what) {
case MESSAGE_POST_RESULT:
// There is only one result
result.mTask.finish(result.mData[0]);
break;
case MESSAGE_POST_PROGRESS:
result.mTask.onProgressUpdate(result.mData);
break;
case MESSAGE_POST_CANCEL:
result.mTask.onCancelled();
break;
}
}
}
Params[] mParams;
}
private static class AsyncTaskResult<Data> {
final AsyncTask mTask;
final Data[] mData;
mTask = task;
mData = data;
}
}
}
发表评论
-
JAVA代码混淆
2016-05-05 18:24 1466JAVA代码混淆 <!--[if !supportL ... -
android 监听状态栏被下拉
2015-12-25 17:23 3499Activity的onWindowFocusChange()方 ... -
android使用mount挂载/system/app为读写权限,删除或替换系统应用
2015-11-27 14:13 4041注意:以下代码中#开头的则为需要执行的shell命令,其他的 ... -
Ubuntu 14.04 文件服务器--samba的安装和配置
2015-11-10 10:49 645jingyan.baidu.com/album/00a07f ... -
intellij 打开工程在每个java文件上 有个红色的无效符
2015-07-24 13:52 1776说明该类不是可编译文件。在project Structure中 ... -
logcat命令详解
2015-07-22 16:34 996Android日志系统提供了记录和查看系统调试信息的功能。日 ... -
gradle打包遇到的错误汇总
2015-07-21 11:32 0错误1:A problem occurred ... -
Android读写XML(下)——创建XML文档
2015-04-29 11:02 624在前面的2篇文章Android读写XML(上)—— pack ... -
Android读写XML(中)——SAX
2015-04-29 10:54 628在Android读写XML(上) ... -
Android读写XML(下)——创建XML文档
2015-04-29 10:52 710在前面的2篇文章Android读写XML(上)—— pack ... -
android:configChanges locale 改语言后,该配置不起作用的原因
2015-03-23 14:38 2546@Override public void on ... -
android.app.Fragment$InstantiationException 解决办法
2015-03-23 13:46 1425android.app.Fragment$Instantia ... -
linux 查看内存
2015-02-10 13:08 7551、free监控内存使用情况 #free 2、watc ... -
android fastboot 刷机 指令
2015-01-19 18:31 1539原生bootloader:bootloader-gro ... -
[Android实例] android中进行https连接的方式的详解 (转发)
2015-01-09 15:50 701x 如果不需要验证服务器端证书, ... -
编译android源码apk是否生成odex方法
2014-10-20 17:19 1658其实Android系统默认的配置是,如果没有指定DISABL ... -
关于android源码中的APP编译时引用隐藏的API出现的问题
2014-10-20 15:36 860今天在编译android源码中的计算器APP时发现,竟然无法 ... -
Android系统进程Zygote启动过程的源代码分析
2014-09-17 10:09 518在Android系统中, ... -
Handler和HandlerThread
2014-09-16 16:58 7011.什么是Handler? SDK中关于Handler的说 ... -
怎样识别三洋18650锂电池电芯
2014-09-01 09:52 1132浏览:20384 | 更新:2011-03 ...
相关推荐
在深入探讨 AsyncTask 的源码之前,我们首先需要理解它的基本用法和工作原理。 ### 1. AsyncTask 的基本使用 AsyncTask 通常包含三个泛型参数:`Params`(输入参数类型)、`Progress`(后台执行过程中的进度类型)...
这个“Android AsyncTask Demo”是开发者为了学习和理解AsyncTask工作原理而编写的示例代码。下面我们将深入探讨AsyncTask的相关知识点。 1. **AsyncTask简介** AsyncTask是Android提供的一个轻量级组件,它允许...
本文将深入探讨 AsyncTask 的内部实现原理、工作流程以及关键代码分析。 首先,AsyncTask 有三个泛型参数,分别代表输入参数类型(Params)、进度更新参数类型(Progress)和结果参数类型(Result)。通过这些参数...
1. **代码结构**:建议将`AsyncTask`作为内部类,使其与使用它的Activity或Fragment紧密结合,方便管理。 2. **错误处理**:确保在`doInBackground()`中捕获异常,避免崩溃,并在`onPostExecute()`中处理异常情况。 ...
本教程将深入讲解AsyncTask的工作原理、如何创建和使用,以及如何实现对异步任务状态的监控,特别是关注任务的结束状态。 AsyncTask的核心理念是“后台计算,前台显示”,它提供了三个泛型参数:Params, Progress, ...
在Android开发中,异步处理是非常关键的一部分,它允许开发者在不阻塞用户界面的情况下执行耗时的操作。...在实际开发中,理解它们的工作原理和应用场景,能够帮助我们编写出更加高效和易维护的代码。
- `javaLooper`这个文件名可能表示该压缩包包含与`Looper`和`Handler`相关的代码示例或解释,这可以帮助我们更好地理解如何在`AsyncTask`中利用这两个组件。 5. **替代方案** - 自Android 3.0(API级别11)起,...
在Android开发中,异步任务(AsyncTask)是一种常见的用于执行后台操作的工具,...通过对比源码与反编译代码,我们可以深入了解Android系统如何调度和管理任务,这对于解决相关问题和实现高效的应用程序设计至关重要。
在深入探讨AsyncTask的“黑暗面”之前,我们先来回顾一下AsyncTask的基本用法和工作原理。 AsyncTask主要由四个关键部分组成:onPreExecute()、doInBackground()、onProgressUpdate()和onPostExecute()。其中,...
- **内存泄漏**:如果Activity持有AsyncTask的引用,而AsyncTask内部又持有Activity的引用,会导致Activity无法正常销毁,从而引发内存泄漏。解决方法是在不需要时取消任务或使用弱引用。 - **序列化执行**:默认...
在阅读给定的博客链接()时,你可以深入理解AsyncTask的实现细节和最佳实践。博客可能涵盖了AsyncTask的源码分析,如何避免内存泄漏,以及如何正确取消AsyncTask等主题。通过深入学习,你可以更好地掌握如何在实际...
### 一、实现原理 1. **确定下载线程范围**: 多线程下载的关键在于将大文件分成多个小块,每个线程负责下载其中一块。例如,如果设定默认下载线程数为5,可以计算每个线程的起始和结束位置。例如,通过`block...
`AsyncTask`内部通过线程池管理后台线程,以及利用`Handler`机制实现主线程与后台线程间的通信。具体来说,`AsyncTask`定义了三个泛型参数: - **Params**:用于启动任务执行的输入参数,例如HTTP请求的URL。 - **...
首先,AsyncTask的工作原理是通过内部创建一个新的线程来执行`doInBackground()`方法,这个方法用于执行非UI相关的计算或网络操作。完成后,结果会被传递给`onPostExecute()`方法,该方法运行在主线程,适合更新UI。...
在Android应用开发中,网络请求是常见的操作,开发者通常会使用不同的库来实现这一功能,如Volley、AsyncTask和FinalHttp。本文将深入探讨这三个工具在网络请求中的使用,以及它们与内存泄漏的关系,特别是针对...
本篇将针对"Android ndroid 查询工具源代码.zip"进行深入剖析,探讨其核心功能与实现原理。 源代码是软件开发的基础,对于Android查询工具而言,源代码揭示了其内部的工作机制。此压缩包中的"Android ndroid 查询...
在Android应用程序开发中,源代码是开发者的心血结晶,它揭示了应用的工作原理和实现细节。密西西比河谷州立大学提供的这个"Android应用程序开发源代码"资源,无疑为学习者提供了一个宝贵的实践平台,能够加深对...
练习中,你将学习如何在Service内部创建线程,如使用Handler、AsyncTask或者Thread类,以实现后台任务的异步执行。同时,你还将了解如何在服务中更新UI,这通常需要用到Handler的post或者Looper机制,确保UI更新在...
在Android开发中,大图加载是一项重要...这个示例代码和apk可以帮助开发者学习和实践上述技术,通过实际操作理解大图加载的原理和最佳实践。通过分析和运行代码,可以进一步掌握Android大图加载的技巧,提升开发能力。