2017-09-04 4 views
-1

Androidのポリシーがブロードキャストの場合、10秒以上経過すると、ANRダイアログが表示されます。アンドロイドで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 
     } 
    } 
} 

このレシーバは、多くの作品。 DB作業、表示作業、asynctask作業。

アンドロイドでANRダイアログが表示されるのを修正する方法はありますか?

ありがとうございました。

答えて

0

放送受信機は非常に高速である必要があります。約2秒であなたのアプリが殺されます。それ以上の時間が必要な場合は、サービスを開始して代わりに行う必要があります。適切な経験則では、何らかの理由でスレッドまたはAsyncTaskを開始する必要がある場合は、サービスを開始する必要があります。

第2に、BroadcastReceiverでスリープ状態にしないでください。それはメインスレッドで発生します。あなたはあなたのアプリを凍結し、たぶんこの問題を引き起こします。

Third - MainActivityの静的関数にアクセスしていますか?それはほぼ確実に間違っています。そのように実際に主なアクティビティにデータを送信するには、メモリリークである静的インスタンスを保持する必要があります。絶対にしてはならないことです。

BraodcastReceiverを正しく書く方法を勉強する必要があります。ちょうどそこにあるすべてのルールが破られました。

関連する問題