Mensaje de tostada persistente: La tostada no desaparecerá después de la ejecución

Tengo un mensaje de brindis que no desaparece después de la ejecución. Supongo que tiene algo que ver con que esté en el bucle, pero no estoy seguro. ¿Puede alguien ayudarme a averiguar por qué el mensaje de brindis no es dispares?

@Override public void onClick(View v) { int index = 0; for(int i= 0; i<userArray.length; i++){ if(email.getText().toString().equals(userArray[i])){ index = i; } if(passArray[index].equals(password.getText().toString())){ Toast.makeText(getBaseContext(), "SUCCESS!", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getBaseContext(), "INVALID LOGIN", Toast.LENGTH_SHORT).show(); } } Intent mainIntent = new Intent(LoginActivity.this, MainActivity.class); startActivityForResult(mainIntent, 0); } 

}

Un mensaje Toast puede quedar bloqueado si lo llama desde un subproceso de servicio y ese subproceso finaliza su trabajo antes de que Toast esté configurado para desaparecer. A continuación, quedará atascado con el mensaje Toast en la pantalla hasta que mate la aplicación.

Toast siempre desaparece. Siempre.

Por lo tanto, está mostrando varios mensajes Toast. Garantizado. Pruebe esto cambiando los mensajes con algún tipo de contador o inhabilitando después de que se muestre el inicial.

Tenga en cuenta que un buen número de tostadas puede apilar y tomar un tiempo loooooong para terminar de mostrar espalda con espalda. Espera y eventualmente desaparecerán siempre y cuando tu aplicación no esté en bucle indefinidamente.

Edición: I stant corregido. Aparentemente, los mensajes Toast pueden quedarse atascados y permanecer visualizados si se inician desde un Thread, Service o IntentService. Gracias @ Johnathan y @zapotec.

Un Toast no siempre desaparece.

"Si lo llamas desde un subproceso de servicio y ese hilo finaliza su trabajo antes de que Toast esté configurado para desaparecer, te quedarás atascado con el mensaje Toast en la pantalla hasta que acabes con la aplicación."

(copiado de la respuesta original por Jonathan Cole , que desafortunadamente fue eliminado)


A continuación, se muestra un seguimiento de la pila de muestra que explica cómo puede ocurrir la situación:

  java.lang.IllegalStateException: Handler (android.os.Handler) {123f93ea} sending message to a Handler on a dead thread at android.os.MessageQueue.enqueueMessage(MessageQueue.java:325) at android.os.Handler.enqueueMessage(Handler.java:631) at android.os.Handler.sendMessageAtTime(Handler.java:600) at android.os.Handler.sendMessageDelayed(Handler.java:570) at android.os.Handler.post(Handler.java:326) at android.widget.Toast$TN.hide(Toast.java:387) at android.widget.Toast.cancel(Toast.java:133) 

Hay algunos casos raros que el pan tostado no desaparecerá. Con el fin de manejar esto, sólo tiene que utilizar el controlador. Crear uno como un campo, y el uso "post (Runnable)" con el brindis que se muestra allí.

Tuve este problema. Lo que encontré es que instancié más de 10 tostadas. Cada uno esperó hasta que el siguiente desapareció antes de mostrar el siguiente, con un total de 20 segundos en la pantalla.

Me pareció que el almacenamiento de todos los brindis en un arraylist, a continuación, cancelar todos ellos arreglar mi problema.

 private ArrayList<Toast> toasts; public void sendToast(final String message) { if (null == toasts) { toasts = new ArrayList<Toast>(); } runOnUiThread(new Runnable() { @Override public void run() { try { Toast toast = Toast.makeText(NJActivity.this, message, Toast.LENGTH_SHORT); toast.setGravity(Gravity.TOP|Gravity.CENTER, 0, 300); toast.show(); toasts.add(toast); } catch(Exception e) {/* do nothing, just means that the activity doesn't exist anymore*/} } }); } public void removeToast() { runOnUiThread(new Runnable() { @Override public void run() { if (null != toasts) { for(Toast toast:toasts) { toast.cancel(); } toasts = null; } } }); } 

Entonces en destruir en parada llamé el método de removeToast ()

 @Override public void onDestroy() { super.onDestroy(); removeToast(); } @Override protected void onStop () { super.onStop(); removeToast(); } 

Aquí está mi solución con un controlador de tostadas personalizado. Funciona perfectamente en mapp.

 public class CustomToast { private LayoutInflater inflater; private Toast toast; private View customToastLayout; private TextView LblCustomToast; public CustomToast() {} public void showCustomToast(String toastMessage, int toastLength, AppCompatActivity context) { if(inflater == null) {inflater = context.getLayoutInflater();} if(customToastLayout == null) {customToastLayout = inflater.inflate(R.layout.toast_layout, (ViewGroup) context.findViewById(R.id.toast_layout_root));} if(LblCustomToast == null) {LblCustomToast = (TextView) customToastLayout.findViewById(R.id.LblCustomToast);} LblCustomToast.setText(toastMessage); if(toast == null) {toast = new Toast(context);} toast.setGravity(Gravity.CENTER_VERTICAL| Gravity.BOTTOM, 0, DPDensity.getPxFromDP(160, context.getResources())); toast.setDuration(toastLength); toast.setView(customToastLayout); if(toast.getView().isShown()) {toast.cancel();}//Toast is cancelled here if currently showing toast.show(); } } 

Aquí está el diseño XML

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/toast_layout_root" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="15dp" android:paddingTop="5dp" android:paddingRight="15dp" android:paddingBottom="5dp" android:orientation="vertical" android:background="@drawable/custom_toast_bg" android:gravity="bottom|center" android:layout_marginBottom="50dp"> <TextView android:id="@+id/LblCustomToast" android:text="Test" android:textSize="16dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/lightLime" android:layout_gravity="center" android:gravity="center"/> </LinearLayout> 

Y aquí está el uso:

 customToast = new CustomToast(); customToast.showCustomToast(getString(R.string.your_message), Toast.LENGTH_SHORT, (AppCompatActivity) mainActivityContext); 
  I m guessing it has something to do with it being in the loop but I'm not sure. 

Sí, usted tiene razón de su beacause apariencia que usted ha mantenido en el bucle for lo que muchas veces el bucle se ejecutará que muchas veces el Toast aparecerá.

Estás mostrando el Toast varias veces en tu código.

Yo sería mejor si su no quiere tostadas varias veces, entonces usted puede escribir a cabo el lado de la bucle.

Creo que el tema es brindis está apareciendo una y otra vez en la pantalla y su tomar el tiempo para despedir. Compruebe su código bye poniendo el bucle exterior tostada y también comprobar si las condiciones son verdaderas varias veces. En resumen, sólo DEBUG su código.

El pan tostado se queda un poco más largo. Siempre desaparecerá una vez generado. Como en bucle que se generan continuamente sobre sí, por lo que le da la ilusión de estar allí siempre. si va a seguir siendo paciente y esperar un poco largo todo desaparecerá después de algún tiempo.

Si desea mostrar el mensaje de éxito.

Trate de hacer el alert dialogue y mantener en la actualización de su mensaje en algunos Text View el mensaje de éxito que desea mostrar en el éxito y el fracaso.

o intenta elevar Toast sólo cuando falla al iniciar sesión.

O compruebe Infintie Loop si desea seguir el mismo enfoque

  • El botón de Android muestra diferentes mensajes de Toast dependen del número de clics
  • Tostadas personalizadas para Android
  • Error al mostrar tostadas
  • Estoy tratando de mostrar un brindis cuando se presiona este botón. Pero el código no funciona
  • Cómo evitar los solapamientos de tostadas múltiples
  • ActionbarSherlock: ¿Un clic largo en el elemento de acción muestra un Toast?
  • Mostrar el widget de brindis debajo de una vista
  • ¿Cómo mostrar un Toast dentro de un Handler / hilo?
  • Detección de mensajes de tostadas
  • ¿Cómo hago un brindis de una clase que no es de actividad?
  • ¿Terminar la actividad después de que el mensaje del pan tostado desaparezca?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.