2017-09-04 1 views
-1

La politique Android si la diffusion fonctionne plus de 10 secondes, se produire boîte de dialogue ANR. Donc, je pense que mon émission fonctionne plus de 10 secondes. parce que beaucoup travaillent cette diffusion.Pourquoi le message ANR Broadcast of Intent s'affiche-t-il sur Android?

ma diffusion lorsque CONNECTIVITY_ACTION sur mon appareil.

@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 
     } 
    } 
} 

ce récepteur, beaucoup de travail. DB travail, travail d'affichage, travail asynctask.

Comment réparer se produire ANR dialogue sur android?

merci.

Répondre

0

Un récepteur de diffusion doit être TRÈS rapide. Vous avez environ 2 secondes, puis votre application est tuée. Si vous avez besoin de plus de temps, vous devez démarrer un service et le faire à la place. En règle générale, si vous devez démarrer un thread ou une tâche asynchrone pour une raison quelconque, vous devez démarrer un service.

Deuxièmement, vous ne devriez JAMAIS dormir sur un récepteur de diffusion. Cela arrive sur le fil principal. Vous allez geler votre application, et probablement causer juste ce problème.

Troisièmement, vous accédez à une fonction statique sur MainActivity? C'est presque assurément faux. Pour qu'il envoie réellement des données à l'activité principale de cette façon, vous devriez en avoir une instance statique qui est une fuite de mémoire. C'est quelque chose qui ne devrait jamais être fait.

Vous avez besoin d'étudier comment écrire un BraodcastReceiver correctement, vous avez cassé à peu près toutes les règles qui existent.