У меня есть приложение для работы с погодой, которое падает, если при загрузке метеорологических данных пользователь выходит из диапазона всех подключений, приложение зависает, а затем падает. Я внедрил 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)
Любые ошибки в журнале при сбое приложения? –
Я добавил две разные ошибки, которые я получаю. – taraloca
Я выяснил первый набор журналов. Я пытаюсь отобразить диалог из неактивности. – taraloca