iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android 中糟糕的AsyncTask
  • 732
分享到

Android 中糟糕的AsyncTask

asynctaskAndroid 2022-06-06 07:06:06 732人浏览 独家记忆
摘要

AsyncTask是一个很常用的api,尤其异步处理数据并将数据应用到视图的操作场合。其实AsyncTask并不是那么好,甚至有些糟糕。本文我会讲AsyncTask会引起哪些问

AsyncTask是一个很常用的api,尤其异步处理数据并将数据应用到视图的操作场合。其实AsyncTask并不是那么好,甚至有些糟糕。本文我会讲AsyncTask会引起哪些问题,如何修复这些问题,并且关于AsyncTask的一些替代方案。

AsyncTask

Android API 3(1.5 Cupcake)开始,AsyncTask被引入用来帮助开发者更简单地管理线程。实际上在Android 1.0和1.1也是有类似的实现,那就是UserTask。UserTask和AsyncTask有着相同的API及实现,但是由于由于1.0和1.1的设备份额微乎其微,这里的概念就不会涉及到UserTask。

生命周期

关于AsyncTask存在一个这样广泛的误解,很多人认为一个在Activity中的AsyncTask会随着Activity的销毁而销毁。然后事实并非如此。AsyncTask会一直执行doInBackground()方法直到方法执行结束。一旦上述方法结束,会依据情况进行不同的操作。

如果cancel(boolean)调用了,则执行onCancelled(Result)方法

如果cancel(boolean)没有调用,则执行onPostExecute(Result)方法

AsyncTask的cancel方法需要一个布尔值的参数,参数名为mayInterruptIfRunning,意思是如果正在执行是否可以打断,如果这个值设置为true,表示这个任务可以被打断,否则,正在执行的程序会继续执行直到完成。如果在doInBackground()方法中有一个循环操作,我们应该在循环中使用isCancelled()来判断,如果返回为true,我们应该避免执行后续无用的循环操作。

总之,我们使用AsyncTask需要确保AsyncTask正确地取消。

不好好工作的cancel()

简而言之的答案,有时候起作用。

如果你调用了AsyncTask的cancel(false),doInBackground()仍然会执行到方法结束,只是不会去调用onPostExecute()方法。但是实际上这是让应用程序执行了没有意义的操作。那么是不是我们调用cancel(true)前面的问题就能解决呢?并非如此。如果mayInterruptIfRunning设置为true,会使任务尽早结束,但是如果的doInBackground()有不可打断的方法会失效,比如这个BitmapFactory.decodeStream() io操作。但是你可以提前关闭IO流并捕获这样操作抛出的异常。但是这样会使得cancel()方法没有任何意义。

内存泄露

还有一种常见的情况就是,在Activity中使用非静态匿名内部AsyncTask类,由于Java内部类的特点,AsyncTask内部类会持有外部类的隐式引用。详细请参考细话Java:”失效”的private修饰符,由于AsyncTask的生命周期可能比Activity的长,当Activity进行销毁AsyncTask还在执行时,由于AsyncTask持有Activity的引用,导致Activity对象无法回收,进而产生内存泄露。

结果丢失

另一个问题就是在屏幕旋转等造成Activity重新创建时AsyncTask数据丢失的问题。当Activity销毁并创新创建后,还在运行的AsyncTask会持有一个Activity的非法引用即之前的Activity实例。导致onPostExecute()没有任何作用。

串行还是并行

关于AsyncTask时串行还是并行有很多疑问,这很正常,因为它经过多次的修改。如果你并不明白什么时串行还是并行,可以通过接下来的例子了解,假设我们在一个方法体里面有如下两行代码

new AsyncTask1().execute();
new AsyncTask2().execute();

上面的两个任务时同时执行呢,还是AsyncTask1执行结束之后,AsyncTask2才能执行呢?实际上是结果依据API不同而不同。

在1.6(Donut)之前:

在第一版的AsyncTask,任务是串行调度。一个任务执行完成另一个才能执行。由于串行执行任务,使用多个AsyncTask可能会带来有些问题。所以这并不是一个很好的处理异步(尤其是需要将结果作用于UI试图)操作的方法。

从1.6到2.3(Gingerbread)

后来Android团队决定让AsyncTask并行来解决1.6之前引起的问题,这个问题是解决了,新的问题又出现了。很多开发者实际上依赖于顺序执行的行为。于是很多并发的问题蜂拥而至。

3.0(Honeycomb)到现在

好吧,开发者可能并不喜欢让AsyncTask并行,于是Android团队又把AsyncTask改成了串行。当然这一次的修改并没有完全禁止AsyncTask并行。你可以通过设置executeOnExecutor(Executor)来实现多个AsyncTask并行。关于API文档的描述如下

If we want to make sure we have control over the execution, whether it will run serially or parallel, we can check at runtime with this code to make sure it runs parallel:


public static void execute(AsyncTask as) {
 if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.HONEYCOMB_MR1) {
   as.execute();
 } else {
   as.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
 }
}
//(This code does not work for API lvl 1 to 3)

真的需要AsyncTask么

并非如此,使用AsyncTask虽然可以以简短的代码实现异步操作,但是正如本文提到的,你需要让AsyncTask正常工作的话,需要注意很多条条框框。推荐的一种进行异步操作的技术就是使用Loaders。这个方法从Android 3.0 (Honeycomb)开始引入,在android支持包中也有包含。可以通过查看官方的文档来详细了解Loaders。

本次译文对原文有少部分删减修改处理。

以上就是对Android AsyncTsak 的资料整理,后继续补充相关资料,谢谢大家对本站的支持!

您可能感兴趣的文章:详解Android中AsyncTask的使用方法Android利用AsyncTask异步类实现网页内容放大缩小Android中通过AsyncTask类来制作炫酷进度条的实例教程详解Android App中的AsyncTask异步任务执行方式Android使用AsyncTask实现多线程下载的方法Android中AsyncTask异步任务使用详细实例(一)Android 中使用 AsyncTask 异步读取网络图片详解Android中AsyncTask机制Android通过Handler与AsyncTask两种方式动态更新ListView(附源码)Android中AsyncTask与handler用法实例分析Android AsyncTask 后监听异步加载完毕的动作详解


--结束END--

本文标题: Android 中糟糕的AsyncTask

本文链接: https://www.lsjlt.com/news/24038.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python中一些糟糕的语法!你遇到过吗
    Python是一门语法优雅,功能强大,开发效率高,应用领域广泛的解释性语言。 其有非常多的优点,但是也并不是完美的,除了大家都知道的执行速度不够快,Python2和Python3的兼容问题,以及GIL锁,在其语法上也有一些特点(是否是缺点...
    99+
    2023-01-30
    遇到过 语法 糟糕
  • 如何全面分析PHP的糟糕设计
    如何全面分析PHP的糟糕设计,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。PHP不仅使用起来尴尬, 还有要嘛我想要的不适合, 要嘛不是最令人满意, 要嘛违背我的...
    99+
    2023-06-17
  • 由 time.AfterFunc() 递归调用的 goroutine 的设计很糟糕
    php小编西瓜认为,"由 time.AfterFunc() 递归调用的 goroutine 的设计很糟糕"这句话反映了一种不合理的设计思路。在并发编程中,递归调用的 goroutine...
    99+
    2024-02-09
  • android中AsyncTask类的示例分析
    这篇文章将为大家详细讲解有关android中AsyncTask类的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。AsyncTask也叫做“异步任务”,是一个抽象类   Asyn...
    99+
    2023-05-30
    android
  • 深入浅析Android中的AsyncTask
    这篇文章给大家介绍深入浅析Android中的AsyncTask,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1、Asynctask简介1.1 使用方法简介Asynctask作为Android的基础之一,怎么使用就不多讲...
    99+
    2023-05-31
    android asynctask cta
  • Android中AsyncTask怎么使用
    在Android中,AsyncTask是一个用于在后台执行异步操作的类。AsyncTask是一个泛型类,它的三个泛型参数分别是Par...
    99+
    2023-09-29
    Android AsyncTask
  • 浅谈Android中AsyncTask的工作原理
    目录概述AsyncTask使用方法AsyncTask的4个核心方法AsyncTask的工作原理概述 实际上,AsyncTask内部是封装了Thread和Handler。虽然Async...
    99+
    2024-04-02
  • AsyncTask如何在Android中使用
    AsyncTask如何在Android中使用?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 Android AsyncTask详解及使用方法 简介:&n...
    99+
    2023-05-31
    android asynctask cta
  • Android中AsyncTask的工作原理是什么
    这篇文章给大家分享的是有关Android中AsyncTask的工作原理是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。概述实际上,AsyncTask内部是封装了Thread和Handler。虽然AsyncTa...
    99+
    2023-06-15
  • 在Android开发中使用 AsyncTask的缺点有哪些
    今天就跟大家聊聊有关在Android开发中使用 AsyncTask的缺点有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在Android开发中,AsyncTask可以使...
    99+
    2023-05-31
    android asynctask cta
  • Win10预览版14332中新开始菜单被指糟糕 用户要求回归旧版
    微软计划为即将到来的Windows 10年度更新(RedStone 1)启用全新的开始菜单设计,但显然新设计并不受所有人的喜爱。自Windows 10 Build 14332开始,用户能够体验全新设计的开始菜单,便于让用...
    99+
    2023-05-20
    Win10 预览版14332 开始菜单
  • android中的多线程下载怎么利用AsyncTask实现
    android中的多线程下载怎么利用AsyncTask实现?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。01 效果图02 核心类 - DownloadTask.classp...
    99+
    2023-05-31
    android asynctask 多线程
  • 如何在Android中利用 AsyncTask对任务进行异步处理
    本篇文章给大家分享的是有关如何在Android中利用 AsyncTask对任务进行异步处理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Android AsyncTask实现异...
    99+
    2023-05-31
    android asynctask cta
  • Android中怎么利用AsyncTask实现下载文件动态更新进度条功能
    Android中怎么利用AsyncTask实现下载文件动态更新进度条功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1. 泛型AysncTask<Params, Pro...
    99+
    2023-05-30
    android asynctask
  • android中的ListView
    在Android中有一个绝对称得上最常用的控件之一,几乎所有的应用都能用到它由于Android运行在手机上,手机屏幕的显示内容并不多,当我们的APP要大量显示数据时就需要用到ListView了ListView运行用户通过手指上下滑动的方式把...
    99+
    2023-06-04
  • Android中的intent
    Intent是Android程序中各组件之间进行交互的主要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据,Intent一般可以被用于启动活动,启动服务以及发送广播等场景Android的应用程序包含三个重要的组件:a...
    99+
    2023-06-04
  • Android 中的权限
    关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、权限分类3.1 安装时权限...
    99+
    2023-12-23
    android gitee
  • Android中的ANR简述
    ANR是Application Not responding,指应用程序未响应,Android系统如果超过预定时间未能得到有效响应或者响应时间过长,都会造成ANR,因为Android系统对于一些事件需要在一定的时间范围内...
    99+
    2023-06-04
  • Android中的传感器
    Android系统提供了对传感器的支持,手机硬件如哦提供了这些传感器,则Android应用可以通过传感器来获取设备外界条件,包括手机的运行状态、外界磁场、温度压力等。Android系统提供了驱动程序来管理这些传感器硬件,对于开发者来说,只要...
    99+
    2023-08-31
    android android studio ide Powered by 金山文档
  • 关闭 Android 中的 SELinux
    关闭 Android 中的 SELinux SELinux(Security-Enhanced Linux)是一种安全性增强的 Linux 内核安全模块,用于提供强制访问控制(MAC)机制。它在 An...
    99+
    2023-10-25
    android Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作