2011-02-04 1 views
1

У меня есть приложение для работы с погодой, которое падает, если при загрузке метеорологических данных пользователь выходит из диапазона всех подключений, приложение зависает, а затем падает. Я внедрил BroadcastReceiver в MainActivity, чтобы обнаружить, когда есть изменение связи. Я зарегистрирую его в onStart и отменил его регистрацию на onStop. Когда это происходит, я отменяю все сообщения и пытаюсь отобразить диалоговое окно, информирующее пользователя о том, что соединение было потеряно. Похоже, что приемник не вызван вовремя, чтобы отменить обработчики. Есть ли способ заставить приоритет, на который призван приемник?Lose All Connections and My Application Crashes Android

Я не уверен, какой код включать, но ниже мой код для обработки приемника:

public BroadcastReceiver mReceiver = new BroadcastReceiver() { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d("#########", "mReciver onReceive MA"); 
     if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) { 
      Log.d("#####", "connectivity action MA mReceiver"); 

      if (mHandler != null) { 
       mHandler.removeMessages(ACCUWX.Messages.DATA_LOADED_FROM_DATABASE); 
       mHandler.removeMessages(ACCUWX.Messages.DATAFEED_DOWNLOAD_COMPLETE); 
       mHandler.removeMessages(ACCUWX.Messages.DATAFEED_DOWNLOAD_FAILED); 
       mHandler.removeMessages(ACCUWX.Messages.DATAFEED_DOWNLOAD_FROM_GPS); 
       mHandler.removeMessages(ACCUWX.Messages.GPS_TIMEOUT_OCCURRED); 
       mHandler.removeMessages(ACCUWX.Messages.LOCATION_CODE_FAILED_FROM_COORDS); 
       mHandler.removeMessages(ACCUWX.Messages.LOCATION_CODE_FOUND_FROM_COORDS); 
       mHandler.removeMessages(ACCUWX.Messages.LOCATION_SEARCH_COMPLETE); 
       mHandler.removeMessages(ACCUWX.Messages.LOCATION_SEARCH_FAILED); 
       mHandler.sendEmptyMessage(ACCUWX.Messages.CONNECTIVITY_CHANGE); 
      } 
     } 

    } 

};  

Отсюда обработчика сообщений:

case ACCUWX.Messages.CONNECTIVITY_CHANGE: 
       Log.d("!#!#@!#[email protected][email protected]#[email protected]!#[email protected]!", "CONNECTIVITY CHANGE MSG"); 
       if (!isNetworkReachable()){ 
        Log.d("@!$#@$#[email protected][email protected]!$#", "network not reachable in CONNECTIVITY CHANGE MA MSG"); 
        if (mLocationSearchDialog != null) mLocationSearchDialog.dismiss(); 
        if (mProgressDialog != null) mProgressDialog.dismiss(); 
        showConnectivityAlertDialog(); 
       } 
       break; 

И внутри этого, этот метод вызвано для обнаружения состояния подключения:

private boolean isNetworkReachable() { 
    Log.d("#########", "isNetworkReachable MA"); 
    boolean airplaneMode = false; 
    boolean mobileConnected; 
    boolean wifiConnected; 
    NetworkInfo wifi, mobile; 
    boolean result = false; 
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 

    try { 
     int airplaneValue = Settings.System.getInt(this.getContentResolver(), Settings.System.AIRPLANE_MODE_ON); 
     airplaneMode = (airplaneValue != 0); 
    } catch (SettingNotFoundException e) { 
     e.printStackTrace(); 
    } 

    mobile = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 
    wifi = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 

    mobileConnected = mobile.isConnected(); 
    wifiConnected = wifi.isConnected(); 

    Log.d("##########", "airplaneMode in MA " + airplaneMode); 
    Log.d("##########", "mobileConnected in MA " + mobileConnected); 
    Log.d("##########", "wifiConnected in MA " + wifiConnected); 

    if (airplaneMode) 
     result = false; 
    else { 
     if (mobileConnected || wifiConnected) 
      result = true; 
    } 
    return result; 
} 

Любая идея, как я могу остановить свое приложение от сбоев и сообщить пользователю, что они потеряли связь?

Мои журналы ошибок несовместимы. Вот два отдельных доклада:

02-04 08:01:02.889: ERROR/AndroidRuntime(6565): FATAL EXCEPTION: main 
02-04 08:01:02.889: ERROR/AndroidRuntime(6565): java.lang.RuntimeException: Unable to start receiver com.accuweather.android.simpleweatherlite.dellstreak.widget.WidgetProvider: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 
02-04 08:01:02.889: ERROR/AndroidRuntime(6565):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2821) 
02-04 08:01:02.889: ERROR/AndroidRuntime(6565):  at android.app.ActivityThread.access$3200(ActivityThread.java:125) 
02-04 08:01:02.889: ERROR/AndroidRuntime(6565):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2083) 
02-04 08:01:02.889: ERROR/AndroidRuntime(6565):  at android.os.Handler.dispatchMessage(Handler.java:99) 
02-04 08:01:02.889: ERROR/AndroidRuntime(6565):  at android.os.Looper.loop(Looper.java:123) 
02-04 08:01:02.889: ERROR/AndroidRuntime(6565):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
02-04 08:01:02.889: ERROR/AndroidRuntime(6565):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-04 08:01:02.889: ERROR/AndroidRuntime(6565):  at java.lang.reflect.Method.invoke(Method.java:521) 
02-04 08:01:02.889: ERROR/AndroidRuntime(6565):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
02-04 08:01:02.889: ERROR/AndroidRuntime(6565):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
02-04 08:01:02.889: ERROR/AndroidRuntime(6565):  at dalvik.system.NativeStart.main(Native Method) 
02-04 08:01:02.889: ERROR/AndroidRuntime(6565): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 
02-04 08:01:02.889: ERROR/AndroidRuntime(6565):  at android.view.ViewRoot.setView(ViewRoot.java:509) 
02-04 08:01:02.889: ERROR/AndroidRuntime(6565):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 
02-04 08:01:02.889: ERROR/AndroidRuntime(6565):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
02-04 08:01:02.889: ERROR/AndroidRuntime(6565):  at android.app.Dialog.show(Dialog.java:241) 
02-04 08:01:02.889: ERROR/AndroidRuntime(6565):  at com.accuweather.android.simpleweatherlite.dellstreak.widget.WidgetProvider.showConnectivityAlertDialog(WidgetProvider.java:127) 
02-04 08:01:02.889: ERROR/AndroidRuntime(6565):  at com.accuweather.android.simpleweatherlite.dellstreak.widget.WidgetProvider.onReceive(WidgetProvider.java:174) 
02-04 08:01:02.889: ERROR/AndroidRuntime(6565):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2810)

и еще:

02-04 07:40:07.330: ERROR/AndroidRuntime(6316): FATAL EXCEPTION: main 
02-04 07:40:07.330: ERROR/AndroidRuntime(6316): java.lang.ArrayIndexOutOfBoundsException 
02-04 07:40:07.330: ERROR/AndroidRuntime(6316):  at com.accuweather.android.simpleweatherlite.dellstreak.MainActivity$10.handleMessage(MainActivity.java:2067) 
02-04 07:40:07.330: ERROR/AndroidRuntime(6316):  at android.os.Handler.dispatchMessage(Handler.java:99) 
02-04 07:40:07.330: ERROR/AndroidRuntime(6316):  at android.os.Looper.loop(Looper.java:123) 
02-04 07:40:07.330: ERROR/AndroidRuntime(6316):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
02-04 07:40:07.330: ERROR/AndroidRuntime(6316):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-04 07:40:07.330: ERROR/AndroidRuntime(6316):  at java.lang.reflect.Method.invoke(Method.java:521) 
02-04 07:40:07.330: ERROR/AndroidRuntime(6316):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
02-04 07:40:07.330: ERROR/AndroidRuntime(6316):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
02-04 07:40:07.330: ERROR/AndroidRuntime(6316):  at dalvik.system.NativeStart.main(Native Method) 
+0

Любые ошибки в журнале при сбое приложения? –

+0

Я добавил две разные ошибки, которые я получаю. – taraloca

+0

Я выяснил первый набор журналов. Я пытаюсь отобразить диалог из неактивности. – taraloca

ответ

0

Ваш первый трассировки стека, потому что вы пытаетесь показать диалог с BroadcastReceiver, насколько я могу сказать.

Ваша вторая трассировка стека исходит из вашего собственного кода, в котором вы проходите мимо конца вашего массива.