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

 

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

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

 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 的所在进程很容易在系统须要内存时被优先杀死 , 由于它属于空进程 ( 没有任何活动组件的进程 ). 若是它的宿主进程被杀死 , 那么正在工做的子线程也会被杀死 . 因此采用子线程来解决是不可靠的。spa

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

相关文章
相关标签/搜索