studio example create alternative android progressdialog preferenceactivity

example - progressdialog in android



Android: "BadTokenException: no se puede agregar ventana; ¿Está funcionando su actividad? "al mostrar el diálogo en PreferenceActivity (5)

Después de introducir el seguimiento de fallas en un proyecto, noté que este problema aparecía con bastante frecuencia y descubrí que el mismo arreglo funcionaba durante todo el proyecto para eliminar el bloqueo:

  • Nunca declare / ejemplifique Diálogos como variables locales.
  • Haz todas las variables de instancia de Dialogs de la Actividad.
  • Anular onDestroy y llamar a if (dialog! = Null) dialog.dismiss ();

Ejemplo:

MyActivity extends Activity { ProgressDialog mProgressDialog; AlertDialog mAlertDialog; @Override public void onCreate(Bundle savedInstanceState) { mProgressDialog = new ProgressDialog(MyActivity.this); mAlertDialog = new AlertDialog.Builder(MyActivity.this).show(); } @Override public void onDestroy() { super.onDestroy(); if(mProgressDialog != null) { mProgressDialog.dismiss(); } if(mAlertDialog != null) { mAlertDialog.dismiss(); } }

Es engañoso que el mensaje de error diga "no se puede agregar ventana", ya que he encontrado que el error ocurre cuando se abandona una Actividad y el contexto que se pasó a su Diálogo está muerto.

Me gustaría pedir ayuda: en mi aplicación, tengo una sola actividad, una actividad de PreferenceActivity (no necesito otra, es simplemente una aplicación de sincronización de fondo, por lo que PrefsActivity es el Principal / PrefsActivity ). Después de las preferencias de configuración del usuario, comprueba checkBoxPreference y eso inicia (o detiene) un servicio. Al comenzar, aparece un diálogo. Pero aquí está el problema: si el usuario presiona hacia atrás (abandona la actividad), lo vuelve a iniciar y luego trata de verificar checkBoxPref ., La prefsactivity falla. Dialog no se muestra. No tengo idea de por qué y cómo solucionarlo.

Este código es exactamente igual con esa parte, lo que me da el problema:

PrefsActivity.java:

package is.it.works; // imports ..... public class PrefsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener { SharedPreferences prefs; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.prefs); prefs = PreferenceManager.getDefaultSharedPreferences(this); prefs.registerOnSharedPreferenceChangeListener(this); }// onCreate @Override public void onSharedPreferenceChanged(SharedPreferences preferences, String key) { if (key.equals("checkTest")) { showDialog(1); } if (key.equals("cancel")) { dismissDialog(1); } }// onSPC @Override protected Dialog onCreateDialog(int id) { switch (id) { case 1: { ProgressDialog dialog = new ProgressDialog(this); dialog.setMessage("press back twice, start the app again, and click checkbox..."); dialog.setIndeterminate(true); dialog.setCancelable(true); dialog.setOnCancelListener(new OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { prefs.edit().putBoolean("cancel", false).commit(); } }); return dialog; }// case }// switch return null; }// onCreateDialog }// PrefsActivity

prefs.xml:

<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <CheckBoxPreference android:key="checkTest" android:title="test" /> </PreferenceScreen>

y el manifiesto:

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="is.it.works" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="4" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".PrefsActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>

Error LogCat:

09-14 10:34:34.472: ERROR/AndroidRuntime(281): Uncaught handler: thread main exiting due to uncaught exception 09-14 10:34:34.502: ERROR/AndroidRuntime(281): android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@43756de8 is not valid; is your activity running? 09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.view.ViewRoot.setView(ViewRoot.java:456) 09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.view.Window$LocalWindowManager.addView(Window.java:409) 09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.app.Dialog.show(Dialog.java:238) 09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.app.Activity.showDialog(Activity.java:2413) 09-14 10:34:34.502: ERROR/AndroidRuntime(281): at is.it.works.PrefsActivity.onSharedPreferenceChanged(PrefsActivity.java:27) 09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.app.ApplicationContext$SharedPreferencesImpl$EditorImpl.commit(ApplicationContext.java:2727) 09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.preference.Preference.tryCommit(Preference.java:1199) 09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.preference.Preference.persistBoolean(Preference.java:1404) 09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.preference.CheckBoxPreference.setChecked(CheckBoxPreference.java:155) 09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.preference.CheckBoxPreference.onClick(CheckBoxPreference.java:143) 09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.preference.Preference.performClick(Preference.java:811) 09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.preference.PreferenceScreen.onItemClick(PreferenceScreen.java:190) 09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.widget.AdapterView.performItemClick(AdapterView.java:284) 09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.widget.ListView.performItemClick(ListView.java:3246) 09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.widget.AbsListView$PerformClick.run(AbsListView.java:1635) 09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.os.Handler.handleCallback(Handler.java:587) 09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.os.Handler.dispatchMessage(Handler.java:92) 09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.os.Looper.loop(Looper.java:123) 09-14 10:34:34.502: ERROR/AndroidRuntime(281): at android.app.ActivityThread.main(ActivityThread.java:4203) 09-14 10:34:34.502: ERROR/AndroidRuntime(281): at java.lang.reflect.Method.invokeNative(Native Method) 09-14 10:34:34.502: ERROR/AndroidRuntime(281): at java.lang.reflect.Method.invoke(Method.java:521) 09-14 10:34:34.502: ERROR/AndroidRuntime(281): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791) 09-14 10:34:34.502: ERROR/AndroidRuntime(281): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549) 09-14 10:34:34.502: ERROR/AndroidRuntime(281): at dalvik.system.NativeStart.main(Native Method) 09-14 10:34:34.522: INFO/Process(52): Sending signal. PID: 281 SIG: 3 09-14 10:34:34.532: INFO/dalvikvm(281): threadid=7: reacting to signal 3 09-14 10:34:34.592: INFO/dalvikvm(281): Wrote stack trace to ''/data/anr/traces.txt'' 09-14 10:34:38.533: DEBUG/dalvikvm(107): GC freed 437 objects / 21560 bytes in 136ms 09-14 10:34:39.183: INFO/global(175): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required. 09-14 10:34:44.632: INFO/global(175): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required. 09-14 10:34:47.412: INFO/Process(281): Sending signal. PID: 281 SIG: 9 09-14 10:34:47.472: INFO/ActivityManager(52): Process is.it.works (pid 281) has died. 09-14 10:34:47.492: INFO/WindowManager(52): WIN DEATH: Window{4394f638 is.it.works/is.it.works.PrefsActivity paused=false}

Después de googlear mucho, creo que la parte incorrecta es el ProgressDialog dialog = new ProgressDialog(this); . Porque this cambia Pero cambiarlo a getApplicationContext() o PrefsActivity.this no ayuda, el problema sigue ahí. Por favor, dime por qué está sucediendo esto y cuál podría ser la solución. ¡Gracias! Estoy atascado, y ahora no tengo ni idea ...


La solución superior solo evita el bloqueo. Para mí, el problema fue que me referí a un context incorrecto para mostrar el cuadro de diálogo de alerta. Después de pasar el context correcto, el problema fue resuelto.


Para mí, esto resolvió el problema ... verificando si el diálogo es nulo o no se muestra y, en caso afirmativo, vuelve a crear.

// create alert dialog if (enableNetworkDialog == null || !enableNetworkDialog.isShowing()) enableNetworkDialog = alertDialogBuilder.create(); if (context instanceof AppCompatActivity && !((AppCompatActivity) context).isFinishing()) enableNetworkDialog.show();


Tal vez no cerró o anuló el registro de algo en su actividad. En ese caso, intente eliminar el registro del receptor de difusión en onDestroy.


Tuve un problema muy similar (que me aterrizó aquí) y encontré una solución muy simple para él. Si bien mi código es diferente, debería ser fácil de adaptar. Aquí está mi solución:

public void showBox() { mActive = true; if (! ((Activity) mContext).isFinishing()) { mDialogBox.show(); } }

Entonces, en el código de muestra de la pregunta, la corrección habría sido (en una suposición):

@Override public void onSharedPreferenceChanged(SharedPreferences preferences, String key) { if (key.equals("checkTest")) { if (! this.isFinishing()) { showDialog(1); } } if (key.equals("cancel")) { dismissDialog(1); } }// onSPC