我想添加一个信息补充,并给出一个指向库或2的指针,可以用于长时间运行的AsyncTask,甚至可以用于面向网络的asynctasks。

AsyncTasks专为在后台执行操作而设计。是的,您可以使用该cancel方法停止它。当您从Internet下载内容时,我强烈建议您在IO阻塞状态下处理您的线程。您应按照以下方式组织下载:public void download() {

//get the InputStream from HttpUrlConnection or any other

//network related stuff

while( inputStream.read(buffer) != -1 && !Thread.interrupted() ) {

//copy data to your destination, a file for instance

}

//close the stream and other resources}

使用该Thread.interrupted标志将帮助您的线程正确地退出阻塞io状态。您的线程将更灵敏地调用该cancel方法。

AsyncTask设计缺陷

但如果您的AsyncTask持续时间过长,那么您将面临两个不同的问题:活动与活动生命周期密切相关,如果活动中断,您将无法获得AsyncTask的结果。的确,是的,你可以,但这将是粗糙的方式。

AsyncTask没有很好的文档记录。一个天真但直观的实现和使用asynctask可能很快导致内存泄漏。

我想介绍的库RoboSpice使用后台服务来执行这种请求。它专为网络请求而设计。它提供了其他功能,例如自动缓存请求的结果。

这就是为什么AsyncTasks对于长时间运行的任务不利的原因。以下推理是对RoboSpice动机的改编:适用于解释为什么使用RoboSpice满足Android平台需求的应用程序。

AsyncTask和Activity生命周期

AsyncTasks不遵循Activity实例的生命周期。如果在Activity中启动AsyncTask并旋转设备,则将销毁Activity并创建新实例。但AsyncTask不会死。它会继续生存直到它完成。

完成后,AsyncTask将不会更新新Activity的UI。实际上,它更新了之前不再显示的活动实例。这可能导致java.lang.IllegalArgumentException类型的异常:如果您使用findViewById来检索Activity内的视图,则View不会附加到窗口管理器。

内存泄漏问题

将AsyncTasks创建为活动的内部类非常方便。由于AsyncTask需要在任务完成或正在进行时操纵Activity的视图,使用Activity的内部类似乎很方便:内部类可以直接访问外部类的任何字段。

然而,这意味着内部类将在其外部类实例上保存一个不可见的引用:Activity。

从长远来看,这会产生内存泄漏:如果AsyncTask持续很长时间,它会使活动保持“活着”,而Android则希望摆脱它,因为它无法再显示。该活动不能被垃圾收集,这是Android在设备上保留资源的核心机制。

您的任务进度将丢失

您可以使用一些变通方法来创建长时间运行的异步任务,并根据活动的生命周期管理其生命周期。您可以在活动的onStop方法中取消AsyncTask,也可以让异步任务完成,而不是松开其进度并将其重新链接到下一个活动实例。

这是可能的,我们展示了RobopSpice的动机,但它变得复杂,而且代码并不是真正的通用。此外,如果用户离开活动并返回,您仍将失去任务的进度。Loaders也出现了同样的问题,尽管它与上面提到的重新链接解决方法的AsyncTask相比更简单。

使用Android服务

最好的选择是使用服务来执行长时间运行的后台任务。这正是RoboSpice提出的解决方案。同样,它专为网络设计,但可以扩展到非网络相关的东西。该库具有大量功能。

你可以通过信息图表在不到30秒的时间内了解它。

对于长时间运行的操作使用AsyncTasks确实是一个非常糟糕的主意。然而,它们适用于短期生活,例如在1或2秒后更新视图。

我鼓励您下载RoboSpice Motivations应用程序,它真正深入地解释了这一点,并提供了有关网络相关内容的不同方法的示例和演示。

如果您正在为非网络相关任务(例如没有缓存)寻找RoboSpice的替代方案,您还可以查看Tape。

android 活动销毁不了,即使活动已经销毁,AsyncTask也不会停止相关推荐

  1. android intent例程,Android开发(四)| 探究活动(详解Intent+大量实例)

    在Android的开发项目中,Activity(活动)是最容易吸引到用户的地方,因为相比于算法.架构,它是实际可见的. Activity是一个可以包含用户界面的组件,主要用于和用户进行交互.一个用户程 ...

  2. Android:日常学习笔记(6)——探究活动(3)

    Android:日常学习笔记(6)--探究活动(3) 活动的生命周期 返回栈 Android中的活动是可以叠加的,我们每启动一个新活动,就会覆盖在原来的活动上,点击Back以后销毁最上面的活动,下面的 ...

  3. 初识Android四大组件之一Activity(活动)

    首先,这是自己学习Android开发1年以来第一次写博客,之前看了很多大佬的技术文章,发现他们也都是从基础开始总结学习的,能及时总结所学知识是一个很好的习惯.温故而知新,可以为师矣.所以,我也寻思着能 ...

  4. android如何导入活动,关于android:如何将活动值传递给另一个活动(Kotlin)

    我是Kotlin的新手,我正在尝试为我的应用进行设置活动,我希望该活动将其价值传递给其他活动. 我尝试了不同的代码,但没有一个起作用,我尝试制作一个共享的首选项文件,但我不知道如何编写代码 要清楚,我 ...

  5. 在android studio中如何创建一个类来继承另外一个类_在Android使用Transition API检测用户活动...

    在当今世界,移动设备是我们日常生活中必不可少的一部分,我们在走路.跑步.开车以及其他许多活动时都会使用移动设备. 了解用户拿着手机的时候在做什么,可以让你的应用程序根据用户的动作进行直观的调整.对于某 ...

  6. android 清单文件注册,在AndroidManifest(清单文件)中注册activity(活动)及配置主活动、更改App图标、App名称、修改隐藏标题栏...

    打开app/src/main/AndroidManifest. package="com.example.administrator.myapplication" > and ...

  7. 如何在Android 10中从后台启动活动

    如何在Android 10中从后台启动活动? https://www.it1352.com/1922748.html 小米手机"后台弹出界面(允许应用在后台弹出界面)"权限问题解决 ...

  8. 三星Android手机助力泰姆凯迪幼儿活动

    三星Android手机助力泰姆凯迪幼儿活动 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 ...

  9. android最佳活动启动方法,026-启动活动的最佳写法

    通常我们启动活动的写法是这样Intent intent = new Intent(FirstActivity.this, SecondActivity.class); intent.putExtra( ...

  10. MBSE建模学习之四:活动(Activity)及活动图

    目录 活动(Activity) 活动图示例 动作(Action) (1)不透明动作(OpaqueAction) (2)调用行为动作(CallBehaviorAction).调用操作动作(CallOpe ...

最新文章

  1. Lua(Codea) 中 table.insert 越界错误原因分析
  2. 5G NPN 行业专网 — 部署模式
  3. 注释(Annotation)
  4. 如何使用Elasticsearch groovy script脚本更新数据
  5. 内核kernel以及根文件系统rootfs是如何映射到对应的nand flash的
  6. Mongo之架构部署(Replica Sets+Sharding)
  7. Tensorflow——add_layer(添加神经层)
  8. 通关制单机器人_智能通关云平台
  9. 新手必备的矢量网络分析仪使用教程
  10. CF1016C Vasya And The Mushrooms
  11. 安卓学习 布局篇 Android studio
  12. HLSL有关的基础知识
  13. Android高级控件之ListView的优化以及下拉刷新页面
  14. echarty轴自定义显示不全,ECharts图表X轴或者Y轴单位内容显示不全
  15. migo初始化库存 s4_SAP项目用户操作手册-MIGO货物移动.docx
  16. RandomAccessFile类 随机流
  17. 【book】计算机组成原理
  18. 蓝桥杯真题:平面分割
  19. 关于virgo插件的初学体验
  20. Linux 系统 vim 的常用命令

热门文章

  1. Neo4j:Cypher –属性值只能是原始类型或其数组
  2. Spring MVC的DispatcherServlet – Java开发人员应该知道的10件事
  3. maven插件编写_编写Maven插件的提示
  4. cdi 作用 spring_什么是CDI,它与@EJB和Spring有什么关系?
  5. FileSystemMap:与文件系统交互的自然方法
  6. ruby和python_Ruby,Python和Java中的Web服务
  7. 批准Oracle IDM中的特定Web服务
  8. 2014年夏末大Java新闻
  9. Java应该是更高级别还是更低级别?
  10. 如何分析线程转储– IBM VM