文档章节

使用Android BroadcastReceiver应该注意的一些问题

人生如歌
 人生如歌
发布于 2014/08/21 15:10
字数 582
阅读 51
收藏 0

今天在 android 的 BroadcastReceiver 里面写一些代码的时候出现了意想不到的异常。情况是这样的:

当我在广播类里面这样定义一个Dialog,然后再在这个类里面调用dimiss方法时,对话框始终不消失,这让我纳闷了很久。。。

 private ProgressDialog dialogDataUpload = null;
 private void dimiss() {
     if (dialogDataUpload != null) {
         dialogDataUpload.dismiss();
         dialogDataUpload = null;
     }
 }

后来仔细端详这个类里面的dimiss方法,发现 Eclipse有一个警告:“This Handler class should be static or leaks might occur”,这让我隐约联想到了以前看到的关于 BroadcastReceiver 的注意事项。后来通过详细地了解 BroadcastReceiver,发现其生命周期只有十秒左右,如果在 onReceive() 内做超过十秒内的事情,就会报ANR(Application No Response) 程序无响应的错误信息,如果需要完成一项比较耗时的工作 , 应该通过发送 Intent 给 Service, 由Service 来完成 . 这里不能使用子线程来解决 , 因为 BroadcastReceiver 的生命周期很短 , 子线程可能还没有结束BroadcastReceiver 就先结束了 .BroadcastReceiver 一旦结束 , 此时 BroadcastReceiver 的所在进程很容易在系统需要内存时被优先杀死 , 因为它属于空进程 ( 没有任何活动组件的进程 ). 如果它的宿主进程被杀死 , 那么正在工作的子线程也会被杀死 . 所以采用子线程来解决是不可靠的。

通过这段解释,让我明白了出现的问题应该是由于我执行了超过10秒的操作,所以在执行取消对话框的操作时广播类的对象已销毁,这样 dimiss 方法肯定不起作用了。所以,我的解决方法是在申明的 Dialog 前面加上 static 属性,这样当广播的生命周期已结束时,由于 static 的属性,dimiss方法就会起作用了。当然最好的办法是按照前面说的,如果是比较耗时的操作,最好启动一个 Service 来处理。

© 著作权归作者所有

人生如歌
粉丝 7
博文 15
码字总数 7993
作品 0
深圳
程序员
私信 提问
网站运营的三个时期,运营者应如何采取措施应对

一般来说网站运营可以分为三个时期,分别是发布期、增长期、稳定期,这三个不同的时期有不同的特点,网站的管理者也应该有不同的应对方式。现在小编就详细的向大家介绍一下这三个不同的时期,...

laishaohe
2018/04/13
0
0
JSON WEB Tokens 和 WebSocket

JSON WEB Tokens JSON Web Token (JWT) 是一种基于token 的认证方案。 在人们大规模地开始Web应用的时候,我们在授权的时候遇到了一些问题,而这些问题不是Cookie所能解决的。Cookie存在一些...

lilugirl
2016/03/31
439
0
Java 中正确使用 hashCode 和 equals 方法

在这篇文章中,我将告诉大家我对hashCode和equals方法的理解。我将讨论他们的默认实现,以及如何正确的重写他们。我也将使用Apache Commons提供的工具包做一个实现。 目录: hashCode()和equ...

王振威
2012/10/21
66.8K
43
测试的基本概念和5要素

软件bug的主要原因: 是因为开发人员没有理解、预见或测试所有可以运行的软件环境。本章主要讨论程序猿引入的bug和运行环境导致的bug 测试人员需要保持的基本态度: *“如何才能攻破这个功能...

钰欣如心
2017/10/17
0
0
C#语言struct结构体适用场景和注意事项

在C#语言中struct结构体和class之间的区别主要是值类型和引用类型的区别,但实际上如果使用不当是非常要命的。从Win32时代过来的人对于struct一点不感觉陌生,但是却反而忽略了一些基本问题。...

炽火
2016/09/05
283
0

没有更多内容

加载失败,请刷新页面

加载更多

maven 环境隔离

解决问题 即 在 resource 文件夹下面 ,新增对应的资源配置文件夹,对应 开发,测试,生产的不同的配置内容 <resources> <resource> <directory>src/main/resources.${deplo......

之渊
今天
8
0
Linux创建yum仓库

第一步、搞定自己的光盘 #创建文件夹 mkdir -p /media/cdrom #挂载光盘 mount /dev/cdrom /media/cdrom #编辑配置文件使其永久生效 vim /etc/fstab 第二步,编辑yun源 vim /ect yum.repos.d...

究极小怪兽zzz
今天
6
0
jar 更新部分文件

C:\Program Files (x86)\Java\jdk1.8.0_102\bin>jar -hIllegal option: hUsage: jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ...Options: -c c......

圣洁之子
今天
9
0
OSChina 周六乱弹 —— 感谢女装红薯开办了这个网站

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @胖达panda:分享歌词: 我有一只小毛驴我从来也不骑,有一天我心血来潮骑着去赶集,我手里拿着小皮鞭我心里正得意,不知怎么哗啦啦,我摔了一...

小小编辑
今天
2.6K
13
DDD(四)

1,引言 软件开发者大多趋向于将关注点放在数据上,而不是领域上。这对于刚入门的DDD的新手而言也是如此。以我目前的思考方式,数据库依然占据主要的地位。开发一个功能,首先我就会考虑我会...

MrYuZixian
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部