Android策略如果广播工作超过10秒,则会发生ANR对话框。
所以,我认为我的广播工作超过10秒。因为很多人都在做这个广播。
我的设备CONNECTIVITY_ACTION
时的广播。
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
int iNetworkType = (activeNetwork == null) ?-1: activeNetwork.getType(); //null check
if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
new getPubIp().execute(); //Execute AsyncTask
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (iNetworkType == connectivityManager.TYPE_ETHERNET) {//connect ethernet
EthernetConnectTimeDB ethernet;
ethernet = new EthernetConnectTimeDB();
ethernet.start(); //DB Insert work.
SystemClock.sleep(500); // sleep
MainActivity.display("value", "value", value"); //display UI
}
}
}
这个接收器,很多工作。数据库工作,显示工作,异步工作。
如何修复android上的ANR对话框?
感谢。
答案 0 :(得分:1)
广播接收器需要非常快。你有大约2秒,然后你的应用程序被杀死。如果您需要更长时间,则需要启动服务并在那里执行。一个不错的经验法则是,如果您因任何原因需要启动线程或AsyncTask,则需要启动服务。
其次,你永远不应该在BroadcastReceiver上睡觉。这发生在主线程上。您将冻结您的应用,并可能导致此问题。
第三 - 您正在访问MainActivity上的静态函数?这几乎肯定是非常错误的。为了实际以这种方式将数据发送到主活动,你必须持有一个静态的实例,这是一个内存泄漏。它应该永远不会完成。
你需要仔细研究如何正确编写BraodcastReceiver,你几乎已经破坏了所有规则。