Android `AsyncTask`简要分析
Android `AsyncTask`简要分析
AsyncTask
简要分析
经典异步任务:AsyncTask
,使用场景有:批量下载,批量拷贝等。官方文档就直接给出了一个批量下载的示例。
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { protected Long doInBackground(URL... urls) { int count = urls.length; long totalSize = 0; for (int i = 0; i < count; i++) { totalSize += Downloader.downloadFile(urls[i]); publishProgress((int) ((i / (float) count) * 100)); // Escape early if cancel() is called if (isCancelled()) break; } return totalSize; } protected void onProgressUpdate(Integer... progress) { setProgressPercent(progress[0]); } protected void onPostExecute(Long result) { showDialog("Downloaded " + result + " bytes"); } } // Once created, a task is executed very simply: new DownloadFilesTask().execute(url1, url2, url3);
这里简单看一下,AsyncTask
中的几个经典问题:
-
AsyncTask
开了几个线程? -
AsyncTask
怎么实现的线程调度?
好吧,就想到了这两个问题。第一个问题,明显是坑。答案是未知的。看手机 cpu
个数了。
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors(); // We want at least 2 threads and at most 4 threads in the core pool, // preferring to have 1 less than the CPU count to avoid saturating // the CPU with background work private static final int CORE_POOL_SIZE = Math.max(2, Math.min(CPU_COUNT - 1, 4)); private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
然后是第二个问题。简单回答就是一句话,通过开启线程执行具体逻辑,然后通过handler
将结果发送到主线程。
进一步追踪的话,就会发现,AsyncTask = ThreadPoolExecutor + Handler 。
通过源码可以看到,AsyncTask
在构造方法里面,已经完成了全部的准备工作。
-
MainHandler
已经创建。 -
FutureTask
已经准备了。(说实话,FutureTask
难过的让人吐血)public AsyncTask(@Nullable Looper callbackLooper) { mHandler = callbackLooper == null || callbackLooper == Looper.getMainLooper() ? getMainHandler() : new Handler(callbackLooper); mWorker = new WorkerRunnable<Params, Result>() { public Result call() throws Exception { mTaskInvoked.set(true); Result result = null; try { Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); //noinspection unchecked result = doInBackground(mParams); // mParams 核心逻辑 Binder.flushPendingCommands(); } catch (Throwable tr) { mCancelled.set(true); throw tr; } finally { postResult(result); // 核心逻辑 } return result; } }; mFuture = new FutureTask<Result>(mWorker) { @Override protected void done() { try { postResultIfNotInvoked(get()); // get() } catch (InterruptedException e) { android.util.Log.w(LOG_TAG, e); } catch (ExecutionException e) { throw new RuntimeException("An error occurred while executing doInBackground()", e.getCause()); } catch (CancellationException e) { postResultIfNotInvoked(null); } } }; }
-
系消息
@MainThread public final AsyncTask<Params, Progress, Result> executeOnExecutor(Executor exec, 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)"); } } mStatus = Status.RUNNING; onPreExecute(); mWorker.mParams = params; // 核心逻辑 exec.execute(mFuture); // 核心逻辑 return this; } // 核心逻辑:handler,将结果发送到主线程 private Result postResult(Result result) { @SuppressWarnings("unchecked") Message message = getHandler().obtainMessage(MESSAGE_POST_RESULT, new AsyncTaskResult<Result>(this, result)); message.sendToTarget(); return result; } 原文地址https://www.cnblogs.com/pythoncat/p/10514933.html
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
直播间搭建过程中较为核心的三个步骤
不知道大家平时有没有看游戏直播的习惯,我偶尔会看。目前游戏直播通常会分成网游和手游两大类,最明显的区别就是一个需要电脑一个需要手机。但这些在开发者眼中看来,直播间搭建的过程都是比较一致的。不过其中也存在需要特殊注意的几个步骤,接下来跟大家简单分享一下。1.流媒体的发布这一环节对于整个直播平台来说是非常重要的了,因为最终面向的是各个终端用户,并且需要提供服务的是分布在全网的各个流媒体服务器。我们也可以这样认为,流媒体服务器的稳定性及性能优劣程度决定着终端用户的产品使用体验效果和直播平台运营成本。所以在开发过程中需要进行适当的改进。 (1)采用C语言实现,以保证流媒体服务器的运行效率最高。(2)将之前的多进程模型改为异步IO模型,从而提高服务器的并发处理性能。(在直播过程中遇到高并发情况时能够及时得到解决)(3)在协议层上增加对RTMP和HLS协议的支撑。(4)为了能够大规模的进行分布式部署、调度和容错,可以引入Hadoop分布式架构。可以通过以上几点在开发过程中做出改进,使得流媒体服务器的整体性能在原有的基础上再进行增高。2.CDN分发这一步骤主要是对流媒体数据在全球范围内的多个节点之间...
- 下一篇
阿里云新手自营建站指南
对于一个建站新手来讲,最重要的莫过于2件事 1.时间效率 2.性价比 换句话讲,对于非专业选手,在整个建站过程,如何省时省力,用相对简单的方式,花更少的钱建好网站是关键。 基于上述,给大家带来一版适合新手的建站指南,供大家参考。一、 注册域名 (域名就是人们常说的“网址”,好比一个网站的门牌号,不可或缺)_ (域名注册) 注意事项:1.域名具有唯一性,同时域名要在63个字符之内,先注先得,一次性最多注册10年,并非永久有效,到期要进行需续费。2.常见的域名后缀为.com(ps:应用最为广泛),有时候您可能无法获得想要的.com域名,那就建议使用 .net, .org 等后缀的域名。不同后缀代表和适合的行业不同,建议选择有相关性的域名后缀,例如:.com 商业性的机构或公司 .org 非盈利的组织、团体.gov.cn 政府部门 .net 从
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2全家桶,快速入门学习开发网站教程
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7安装Docker,走上虚拟化容器引擎之路