为什么在Android上发生ANR广播Intent消息?

时间:2017-09-04 08:26:24

标签: android android-intent

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对话框?

感谢。

1 个答案:

答案 0 :(得分:1)

广播接收器需要非常快。你有大约2秒,然后你的应用程序被杀死。如果您需要更长时间,则需要启动服务并在那里执行。一个不错的经验法则是,如果您因任何原因需要启动线程或AsyncTask,则需要启动服务。

其次,你永远不应该在BroadcastReceiver上睡觉。这发生在主线程上。您将冻结您的应用,并可能导致此问题。

第三 - 您正在访问MainActivity上的静态函数?这几乎肯定是非常错误的。为了实际以这种方式将数据发送到主活动,你必须持有一个静态的实例,这是一个内存泄漏。它应该永远不会完成。

你需要仔细研究如何正确编写BraodcastReceiver,你几乎已经破坏了所有规则。