文档章节

关于异步任务设计的几点思考

snowdream
 snowdream
发布于 2016/03/01 11:09
字数 650
阅读 36
收藏 0

同步发布在:http://localhost:4000/blog/2016/02/18/thinking-in-asyncTask/

为什么需要异步任务

  1. 手机上的CPU和内存等资源是有限的。
  2. android应用有一个主线程常用于界面的更新。如果所有事情(包括耗时操作,IO操作,网络操作)都在主线程进行,可能因为系统无法及时处理而导致界面卡顿,甚至ANR。
  3. 为了避免ANR,解决卡顿问题,提高应用操作流畅性,我们需要把(耗时操作,IO操作,网络操作)等耗时/耗资源的操作放到异步的子线程中进行。

ANR超时时间在ActivityManagerService.java文件中进行了定义

1.前台broadcast超时时间为10秒,后台broadcast超时时间为60秒
    // How long we allow a receiver to run before giving up on it.
    static final int BROADCAST_FG_TIMEOUT = 10*1000;
    static final int BROADCAST_BG_TIMEOUT = 60*1000;


2.按键无响应的超时时间为5秒
    // How long we wait until we timeout on key dispatching.
    static final int KEY_DISPATCHING_TIMEOUT = 5*1000;

异步任务需要具有的几个特点

界面关联性(Fragment/Activity) 可选

异步任务通常是用来执行耗时操作,最后将执行结果回调给主线程,进行更新界面。 假如,异步任务回调结果的时候,界面已经销毁,又将会发生什么??? 应用很可能会崩溃,并抛出以下错误日志:

Java.lang.IllegalStateException Activity has been destroyed

解决办法:
异步任务中保存界面(Fragment/Activity)的弱引用。在将要回调之前,判断界面是否已经被销毁。如果已经被销毁,则不进行回调。

可取消特性 可选

假设异步任务在执行一个耗时的循环操作,此时,用户按返回键退出界面,异步任务怎么处理??? 如果该异步任务的目的也是为了更新界面,那么界面销毁,应该及时停止任务,并不进行回调。

解决办法:
创建异步任务的时候,返回一个Cancellable的接口。 用户通过该接口进行取消。在将要回调之前,判断异步任务是否被取消。如果异步任务已经被取消,则不进行回调。

统一线程池 必选

建议统一线程池,所有异步任务都扔给线程池执行。 不推荐直接使用Thread类。

异步任务方案

  1. AsyncTask
  2. 自己封装异步任务(Runnable/Callable)

其中,AsyncTask简单,方便,但缺少可定制性。如果条件允许,建议自己封装异步任务。

© 著作权归作者所有

共有 人打赏支持
snowdream

snowdream

粉丝 20
博文 12
码字总数 6591
作品 15
海淀
程序员
Java7中的Fork/Join框架,到底在什么情况下才会采用工作窃取算法?

在学习《Java 7并发编程实战手册.pdf》第五章时,有一段话让我思考很久都很难理解,测试结果也不准确和信服,还请大家指教。 “当你使用同步方法,调用这些方法(比如:invokeAll()方法)的任...

JarvisZhu
2016/11/19
547
1
异步并行批处理框架设计的一些思考

随着互联网信息技术日新月异的发展,一个海量数据爆炸的时代已经到来。如何有效地处理、分析这些海量的数据资源,成为各大技术厂商争在激烈的竞争中脱颖而出的一个利器。可以说,如果不能很好...

开源中国总统
2016/04/08
219
0
JavaScript异步执行辅助工具--ocSteps

ocSteps 是一个JavaScript异步执行辅助工具,主要用于支持 Node.js 中的大量异步API以及操作,以及前端浏览器里的异步任务(例如Ajax)。如果你听说过“回调地狱”这个词,那么,ocSteps 的用...

周谦
2013/05/11
360
0
关于Redis的一些思考和总结

日常的业务系统中经常使用到redis,平时也会研究下redis的设计文档和源码,对redis的使用场景、实现方案、运维要点这些常规知识点都有所了解,但是零零碎碎总感觉不够系统,这里结合源码对自...

zqrferrari
2017/11/21
0
0
关于领域驱动设计(DDD)中聚合设计的一些思考

原文:关于领域驱动设计(DDD)中聚合设计的一些思考 关于DDD的理论知识总结,可参考这篇文章。 DDD社区官网上一篇关于聚合设计的几个原则的简单讨论: 文章地址:http://dddcommunity.org/l...

杰克.陈
2017/12/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

多线程

1. 多线程概念。并发和并行的概念。 多线程指的是一段时间内cpu同时执行多个线程。一个程序至少运行>=1个进程,进程就是运行中的程序,而一个进程至少运行>=1个线程,线程是操作系统能调度的...

鱼想吃肉
22分钟前
0
0
HBase 表修复在线方式和离线方式

一、在线修复 1.1 使用检查命令 $ ./bin/hbase hbck 该命令可完整修复 HBase 元数据信息;存在有错误信息会进行输出; 也可以通过如下命令查看详细信息: $ ./bin/hbase hbck -details 1.2 ...

Ryan-瑞恩
47分钟前
1
0
redis 系列二 -- 常用命令

1.基础命令 info ping quit save dbsize select flushdb flushall 2.键命令 2.1 set 直接赋值 set a a 2.2 get 取值 get a 2.3 exists 是否存在 exists a 2.4 expire 设置剩余时间 秒 expire......

imbiao
今天
2
0
php foreach

<?php// 数组的引用$a=array(1,2,3,4,5);foreach($a as $key=>&$value){$value=$value*2;}print_r($a);echo " $key -------------------$value\r\n";/** * ...

小张525
今天
3
0
12-利用思维导图梳理JavaSE-多线程

12-利用思维导图梳理JavaSE-多线程 主要内容 1.线程概念 2.线程开发 3.线程的状态 4.线程的同步和死锁 5.Java5.0并发库类 QQ/知识星球/个人WeChat/公众号二维码 本文为原创文章,如果对你有一...

飞鱼说编程
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部