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

简介: 为什么需要异步任务 手机上的CPU和内存等资源是有限的。 android应用有一个主线程常用于界面的更新。如果所有事情(包括耗时操作,IO操作)都在主线程,可能因为系统无法及时处理而导致界面卡顿,甚至ANR。 ANR超时时间在ActivityManagerService.java文件中进行了定

为什么需要异步任务

  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简单,方便,但缺少可定制性。如果条件允许,建议自己封装异步任务。

相关文章
|
28天前
|
安全 Java 调度
【C/C++ 线程池设计思路 】设计与实现支持优先级任务的C++线程池 简要介绍
【C/C++ 线程池设计思路 】设计与实现支持优先级任务的C++线程池 简要介绍
43 2
|
3月前
|
iOS开发
多线程和异步编程:解释 iOS 中的同步和异步任务的概念。
多线程和异步编程:解释 iOS 中的同步和异步任务的概念。
37 1
|
3月前
|
存储 前端开发 rax
|
5月前
|
存储 前端开发 rax
2.7 协程设计原理
2.7 协程设计原理
34 0
|
11月前
|
安全 Java 程序员
面试题 | 异步任务的各种组合方式(一)
面试题 | 异步任务的各种组合方式(一)
96 0
|
前端开发
前端学习案例5-执行机制1
前端学习案例5-执行机制1
62 0
前端学习案例5-执行机制1
|
前端开发
前端学习案例6-执行机制2
前端学习案例6-执行机制2
43 0
前端学习案例6-执行机制2
JobService源码探究之 onStartJob()里如何优雅地处理耗时逻辑?
JobService源码探究之 onStartJob()里如何优雅地处理耗时逻辑?
|
运维 Prometheus Kubernetes
工作用Go: 异步任务怎么写6 | Asynq: 专业异步任务框架
工作用Go: 异步任务怎么写6 | Asynq: 专业异步任务框架
1691 0
工作用Go: 异步任务怎么写6 | Asynq: 专业异步任务框架
|
前端开发 API
我明白了,前端并发函数
谷歌浏览器的并发数是6个,有六个请求正在处理,那么其它的任务就会排队,等六个请求任务中的某一个完成之后,就会立马插入进去执行。这样一来,就清楚了。
149 0
我明白了,前端并发函数

热门文章

最新文章