2010-07-21 16 views
27

Tengo un IntentService que descarga algunos archivos. El problema es que creo un pan tostado en el interior del IntentService como estoToast creado en un IntentService nunca desaparece

Toast.makeText(getApplicationContext(), "some message", Toast.LENGTH_SHORT).show(); 

La tostada que nunca desaparecerá caso si salir de la aplicación. La única forma de destruirlo es matar el proceso.

¿Qué estoy haciendo mal?

+0

No hay razón no para crear un brindis de un servicio. De [la guía de desarrollo de notificaciones] (http://developer.android.com/guide/topics/ui/notifiers/toasts.html): > Si crea una notificación de brindis de un servicio, aparece al frente de la actividad actualmente en foco. –

+0

Eso debe estar mal, porque no funciona cuando lo prueba con IntentService. La solución de @ rony funciona mejor. –

Respuesta

-8

No debe crear Toast s a partir de Service. Deberías usar un Notification en su lugar.

+11

incorrecto de http://developer.android.com/guide/topics/ui/notifiers/toasts.html "Se pueden crear y exhibir tostadas desde una actividad o servicio". No funciona porque "Servicio" se ejecuta en el hilo Principal, mientras que el "Servicio de Intención" se ejecuta en otro hilo. – Palani

+6

El hecho de que pueda hacer algo no significa que deba hacer algo. No deberías crear tostadas de un servicio. – Qberticus

+0

@Qberticus, ¿puede actualizar su respuesta con un ejemplo de código de cómo se usaría la notificación en este caso? –

69

El problema es que IntentService no se está ejecutando en el subproceso principal de la aplicación. necesita obtener Handler para el hilo principal (en onCreate()) y publicar el Toast como Runnable.

el siguiente código debe hacer el truco:

@Override 
public void onCreate() { 
    super.onCreate(); 
    mHandler = new Handler(); 
} 

@Override 
protected void onHandleIntent(Intent intent) { 
    mHandler.post(new Runnable() {    
     @Override 
     public void run() { 
      Toast.makeText(MyIntentService.this, "Hello Toast!", Toast.LENGTH_LONG).show();     
     } 
    }); 
} 
+0

El manipulador es abstracto – rkmax

+8

no, no lo es. http://developer.android.com/reference/android/os/Handler.html – maysi

+5

@rkmax android studio por alguna razón se predetermina a 'import java.util.logging.Handler;' (que es abstracto) cámbielo a 'importación android.os.Handler; ' – chacham15

8

IntentService creará un hilo para manejar el nuevo intento, y se termina de inmediato una vez que la tarea se ha hecho. Entonces, el Toast estará fuera de control por un hilo muerto.

Debería ver algunas excepciones en la consola cuando se muestran las tostadas en la pantalla.

+0

+1 para señalar el mecanismo del hilo de trabajo en IntentService. –

0

Para mostrar un brindis cuando el usuario está en una de las actividades de la aplicación.

sólo necesitan una referencia de la actividad actual, y lo llaman con este código de ejemplo:

public void showToast(final String msg) { 
    final Activity a = currentActivity; 
    if (a != null) { 
     a.runOnUiThread(new Runnable() { 

      @Override 
      public void run() { 
       Toast.makeText(a, msg, Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 
} 

Hay una gran cantidad de opciones para conseguir la actividad actual, marque esta pregunta: ¿ How to get current foreground activity context in android?

pero yo uso este enfoque:

La aplicación debe tener:

private Activity currentActivity = null; 

public Activity getCurrentActivity() { 
    return currentActivity; 
} 

public void setCurrentActivity(Activity mCurrentActivity) { 
    this.currentActivity = mCurrentActivity; 
} 

Cada actividad debe tener:

@Override 
protected void onResume() { 
    super.onResume(); 
    ((MyApplication) getApplication()).setCurrentActivity(this); 

} 
@Override 
protected void onPause() { 
    super.onPause(); 
    ((MyApplication) getApplication()).setCurrentActivity(null); 
} 
+1

Llamada 'super.onPause()' de 'onPause' – TWiStErRob

+0

¡Oh Dios mío, un error! ... Pero ya no está. –

17

Esto funciona para mí:

public void ShowToastInIntentService(final String sText) { 
    final Context MyContext = this; 

    new Handler(Looper.getMainLooper()).post(new Runnable() { 
     @Override 
     public void run() { 
      Toast toast1 = Toast.makeText(MyContext, sText, Toast.LENGTH_LONG); 
      toast1.show(); 
     } 
    }); 
}; 
+0

no funciona para mí ... – Shmuel

+0

Eso fue lo que hizo el truco para mí ... Thx Ton – Vishnu

1

Para las personas en desarrollo en el estudio Xamarin, esto es como se hace allí:

Handler handler = new Handler(); 
handler.Post (() => { 
    Toast.MakeText (_Context, "Your text here.", ToastLength.Short).Show(); 
}); 
Cuestiones relacionadas