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

我想添加一个信息补充,并给出一个指向库或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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339168.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python输入input数组_python怎么输入数组

python怎么输入数组? python输入数组 一维数组:arr input("") //输入一个一维数组,每个数之间使空格隔开 num [int(n) for n in arr.split()] //将输入每个数以空格键隔开做成数组 print(num) //打印数组 一维数组输入输出示例&a…

eclipse 扩展_Eclipse扩展的轻量级集成测试

eclipse 扩展最近,我为Eclipse扩展点评估引入了一个小助手。 辅助程序努力减少通用编程步骤的样板代码,同时增加开发指导和可读性。 这篇文章是希望的后续文章,它显示了如何将实用程序与AssertJ定制断言结合使用,以编写针对Eclip…

深入理解右值引用,move语义和完美转发

move语义最原始的左值和右值定义可以追溯到C语言时代,左值是可以出现在赋值符的左边和右边,然而右值只能出现在赋值符的右边。在C 里,这种方法作为初步判断左值或右值还是可以的,但不只是那么准确了。你要说C 中的右值到底是什么&…

android startanimation 回调,ScheduledThreadPoolExecutor执行莫名停止问题Android几个动画回调运行线程...

本文记录两个问题:ScheduleThreadPoolExecutor莫名停止执行。Animation和Animator两个动画回调监听 运行在哪个线程。一:ScheduleThreadPoolExecutor问题:ScheduledThreadPoolExecutor中scheduleWithFixedDelay(command, initialDelay, delay…

java future用法_纯干货:Java学习过程中的21个知识点和技术点

我们在Java学习过程中要学会抓重点,善于总结,Java学习过程中常见的21个知识点和技术点你知道吗?下面和千锋广州小编一起来看看吧!1. JVM相关对于刚刚接触Java的人来说,JVM相关的知识不一定需要理解很深,对此…

zz测试接口_使用FizzBu​​zz和JUnitParams进行单元测试

zz测试接口我有时使用FizzBu​​zz向新手演示单元测试的基础。 尽管FizzBu​​zz确实是一个简单的问题,但它也可以用于演示更高级的单元测试技术,例如实现参数化测试。 FizzBu​​zz的可能解决方案之一是: public class FizzBuzz {private …

如何优雅地检测类型/表达式有效性?

注1:本文至少需要编译器支持C 11。注2:本文不考虑使用宏。一、老办法在写C 的时候,有时候可能需要检查一个类是否有特定的成员类型,例如:// 检查 T::type 是否存在,存在则 value 为 true,否则为…

html的页面宽高变形问题,CSS+div 设计的网页在不同浏览器中变形的问题

给别人做了一个web,自己这边正常,一到对方,机器上,发现变形了,真郁闷,后来才发现时IE7.0惹得祸,没有办法,学习呗。如何使网页在IE7.0和火狐中不变形?以下的方法可行&…

python爬虫开发 从入门到实战_python网络爬虫从入门到实战开发

1、简单的抓取网页 from urllib import request reqrequest.Request("http://www.baidu.com") responserequest.urlopen(req) htmlresponse.read() htmlhtml.decode("utf-8") print(html) 2、这里补充点Post和Get提交数据的差别 如果使用POST提交表单数据&…

swagger api文档_带有Swagger的Spring Rest API –公开文档

swagger api文档创建API文档后,将其提供给涉众很重要。 在理想情况下,此发布的文档将足够灵活以解决任何最后的更改,并且易于分发(就成本以及完成此操作所需的时间而言)。 为了使之成为可能,我们将利用我在…

html 页面重复度高,哪些情况容易造成重复页面

摘要在很多情况下我们明明没有发布重复页面,但为什么产生重复呢?下面我们一起来看看哪些情况容易造成重复页面?以及我们应该如何处理?abc.comabc.com/index.html在浏览器地址栏中输入这四个不同的URL链接,打在很多情况…

nuxt解决首屏加载慢问题_一个 Node 脚本让你的前端项目加载速度飞起来

写在最前面我的原创什么声明变成什么鬼了……前言随着前端三大框架的盛行,越来越多的前后端分离项目在服务器上跑了起来,随之而来,开发者也慢慢发现了这种开发模式所带来的弊端,其中之一就是首屏加载速度特别慢,因为虽…

数据库连接配置tomcat_Tomcat到Wildfly:配置数据库连接

数据库连接配置tomcat该摘录摘自《 从Tomcat到WildFly 》一书,您将在其中学习如何将现有的Tomcat体系结构移植到WildFly,包括服务器配置和在其顶部运行的应用程序。 WildFly是完全兼容的Java Enterprise Edition 7容器,与Tomcat相比&#xf…

左值、右值、左值引用、右值引用

【导读】:本文主要详细介绍了左值、右值、左值引用、右值引用以及move、完美转发。左值和右值左值(left-values),缩写:lvalues右值(right-values),缩写:rvalues直接上官网…

itex将html转成pdf加水印,itext操作PDF文件添加水印

功能描述:添加图片和文字水印/**** 【功能描述:添加图片和文字水印】 【功能详细描述:功能详细描述】* param srcFile 待加水印文件* param destFile 加水印后存放地址* param text 加水印的文本内容* param textWidth 文字横坐标* param tex…

wxpython界面切换_wxpython实现按钮切换界面的方法

本文实例为大家分享了wxpython按钮切换界面的具体实现代码,供大家参考,具体内容如下 #-*- coding:utf-8 -*- import wx class TestFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self,None,-1,u登陆,size(370,280),stylewx.MINIMIZE_BOX| wx.…

jboss 4.3.0_JBoss BPM Suite 6.0.3版本的5个实用技巧

jboss 4.3.0上周,红帽发布了JBoss BPM Suite的下一个版本,标记为6.0.3 ,已订阅的用户可以在其客户门户中使用。 如果您对本发行版中的新增功能感到好奇,请在客户门户网站上在线查看发行说明和其余文档 。 我们正在寻找一些简单的…

C 条件变量使用详解

condition_variable介绍在C 11中,我们可以使用条件变量(condition_variable)实现多个线程间的同步操作;当条件不满足时,相关线程被一直阻塞,直到某种条件出现,这些线程才会被唤醒。其主要成员函…

HTML5新布局元素布局,HTML5新的布局元素

HTML5相对于HTML4新增了一些布局元素新增布局标签的优点:⒈更加注重文档的结构内容而不是以什么形式展现出来⒉对人的友好,更加语义化,增加代码的可读性⒊对计算机友好,浏览器更容易解析新增布局标签的内容:新增的布局…

pannel添加的子窗体很大_超简单的地瓜粉焖子做法全解,零失败

总以为做焖子是一项很大的工程,如果朋友知道你会做焖子定会用惊叹的语气崇拜你,想多一项厨艺吗,想让家人吃上自己亲手做的焖子吗?使用艺琳农场的地瓜粉一定让你出手不凡的,超简单,往下看哦新手为了担心霍霍…