广播中等待较久出现anr问题

需要实现一个开机时刻启动升级服务的功能,但是接受的广播为android的"android.intent.action.BOOT_COMPLETED",接收到广播后,系统的网络并不一定就绪,在网络不通的情况下可能导致本次升级服务启动不了。

解决方法是,在接收到广播之后查询网络状况,如果网络通畅,则启动升级服务,否则等待150s,直到网络通畅再启动升级。

该方法成功的解决了收到开机广播和网络就绪不同步问题,保证升级服务在有线连接和wifi连接情况下都能够顺利启动。

需要注意的一点是,等待操作不能直接加入到广播接受的reviever函数中,这样,如果等待时间较久,一般超过十秒钟,会报anr错误。

E/ActivityManager( 2029): ANR in com.tcl.mtk.mtkVersionUpdate
E/ActivityManager( 2029): PID: 2810
E/ActivityManager( 2029): Reason: Broadcast of Intent { act=android.intent.action.BOOT_COMPLETED flg=0x18000010 cmp=com.tcl.mtk.mtkVersionUpdate/.broadcastManage.BroadCastManger (has extras) }
E/ActivityManager( 2029): Load: 4.17 / 0.97 / 0.32

代码实现片段:

@Override
public void onReceive(Context context, Intent intent) {

mContext = context;
String action = intent.getAction();
if (action.equals(BroadCastType.systemBootFinished)) { // 系统启动完成,首先判断自动升级是否已经开启,如果自动升级已经开启,则需要启动自动升级;
System.out.println("received systemBootFinished broadcast:"
+ BroadCastType.standServiceFinished);

new AutoNetworkUpdateThread().start();

}
}

class AutoNetworkUpdateThread extends Thread {

public void run() {
Log.i(TAG, "AutoNetworkUpdateThread in");

boolean isNetworkAlive = isNetworkAvailable(mContext);

if (isNetworkAlive) {
Log.i(TAG, "isNetworkAlive = " + isNetworkAlive);
standardServiceFinished(mContext);
} else {

//实现连接不上则尝试五十次连接功能
int attemptTime = 0;
while (attemptTime < maxConnectTime) {
Log.d(TAG,"attemptStrTime = " + attemptTime);
isNetworkAlive = isNetworkAvailable(mContext);
Log.i(TAG, "isNetworkAlive = " + isNetworkAlive);
if (isNetworkAlive) {
standardServiceFinished(mContext);
break;
}

try {
Thread.sleep(3000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

Log.d(TAG,"The " + attemptTime + " time attempt...." );
if (attemptTime == maxConnectTime - 1) {
Log.d(TAG,"The last time attempt str update....throw Exception...." );
}
attemptTime++;
}

}

}
}

时间: 2024-10-08 01:26:07

广播中等待较久出现anr问题的相关文章

MVC 如何在一个同步方法(非async)方法中等待async方法

MVC 如何在一个同步方法(非async)方法中等待async方法 问题 首先,在ASP.NET MVC 环境下对async返回的Task执行Wait()会导致线程死锁.例: public ActionResult Asv2() { //dead lock var task = AssignValue2(); task.Wait(); return Content(_container); } private void Assign() { _container = "Hello World&q

java中等待所有线程都执行结束

转自:http://blog.csdn.net/liweisnake/article/details/12966761 今天看到一篇文章,是关于java中如何等待所有线程都执行结束,文章总结得很好,原文如下http://software.intel.com/zh-cn/blogs/2013/10/15/java-countdownlatchcyclicbarrier/?utm_campaign=CSDN&utm_source=intel.csdn.net&utm_medium=Link&a

python selenium中等待元素出现及等待元素消失操作

在自动化测试中,很多时候都会有等待页面某个元素出现后能进行下一步操作,或者列表中显示加载,直到加载完成后才进行下一步操作,但时间都不确定,如下图所示 幸运的是,在selenium 2后有一个模块expected_conditions,里面有很多函数可以完成这个工作,相关博客可见 http://www.cnblogs.com/nbkhic/p/4885041.html 但在selenium 1中或自己仅仅想写个简单用法该怎么处理那?解决如下: from selenium.common.except

android 中使用自定义权限在广播中的利用

1.在一个进程中发送一个有自定义权限的广播,另外一个进程中拥有广播接受者接受到该广播 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="im.weiyuan.com.hkkj"> <application andro

android image加载中等待动画

Xml代码   在布局中添加一个ImageViw和一个EditText. Xml代码   <ImageView android:id="@+id/loading_imageView_info" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:ba

ASP.NET MVC 如何在一个同步方法(非async)方法中等待async方法

问题 首先,在ASP.NET MVC 环境下对async返回的Task执行Wait()会导致线程死锁.例: public ActionResult Asv2() { //dead lock var task = AssignValue2(); task.Wait(); return Content(_container); } private void Assign() { _container = "Hello World"; } public async Task AssignVa

netframework中等待多个子线程执行完毕并计算执行时间

本文主要描述在.netframework中(实验环境.netframework版本为4.6.1)提供两种方式等待多个子线程执行完毕. ManualResetEvent 在多线程中,将ManualResetEvent实例作为方法传入,线程执行完毕后可以设置标志位来标识当前线程已经执行完毕.代码如下: 1 List<ManualResetEvent> manualResetEvents = new List<ManualResetEvent>(); 2 /// <summary&

c# Task多线程并行任务中等待所有线程都执行完成

C#多线程中如何等待所有线程的任务都执行完成呢?在.net 4.0以4.0+中,有Task.WaitAll(params Task[] tasks)方法来等待所有Task[],而不需要更多的操作.按照微软官方的文档,我写了一个实例来调试和说明: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Thre

css 实现页面加载中等待效果

<!DOCTYPE html> <html> <head> <title>css实现页面加载中,请稍候效果</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my pa