2010-10-17 12 views
25

Estoy intentando que mi servicio de intención muestre un mensaje de Toast, , pero al enviarlo desde el mensaje de onHandleIntent, la tostada se muestra pero se atasca y la pantalla nunca se va. Supongo que es porque el método onHandleIntent no ocurre en el hilo de servicio principal, pero ¿cómo puedo moverlo?Cómo crear tostadas desde IntentService? Se queda atascado en la pantalla

¿Alguien tiene este problema y lo solucionó?

+0

duplicado posible de [tostadas creado en un IntentService nunca desaparece] (http://stackoverflow.com/questions/3296639/toast-created-in-an-intentservice-never-goes-away) –

Respuesta

32

en onCreate() inicialice un Handler y luego publíquelo desde su hilo.

private class DisplayToast implements Runnable{ 
    String mText; 

    public DisplayToast(String text){ 
    mText = text; 
    } 

    public void run(){ 
    Toast.makeText(mContext, mText, Toast.LENGTH_SHORT).show(); 
    } 
} 
protected void onHandleIntent(Intent intent){ 
    ... 
    mHandler.post(new DisplayToast("did something")); 
} 
+3

¿A qué se inicializó su mContext? –

+0

Es una referencia al servicio. – schwiz

+0

la tostada hecha de esta manera no desaparecerá. ¿Hay algo que debería agregar, excepto el código anterior? – Yulong

3

Utilice la palanca para publicar un Ejecutable la que el contenido de su operación

protected void onHandleIntent(Intent intent){ 
    Handler handler=new Handler(Looper.getMainLooper()); 
    handler.post(new Runnable(){ 
    public void run(){ 
     //your operation... 
     Toast.makeText(getApplicationContext(), "hello world", Toast.LENGTH_SHORT).show(); 
    } 
}); 
3

Este es el código IntentService clase completa demostrando tostadas que me ayudaron:

package mypackage; 

import android.app.IntentService; 
import android.content.Intent; 
import android.os.Handler; 
import android.os.Looper; 
import android.widget.Toast; 

public class MyService extends IntentService { 
    public MyService() { super("MyService"); } 

    public void showToast(String message) { 
     final String msg = message; 
     new Handler(Looper.getMainLooper()).post(new Runnable() { 
      @Override 
      public void run() { 
       Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show(); 
      } 
     }); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     showToast("MyService is handling intent."); 
    } 
} 
+0

no es posible crear un Toast usando un contexto de aplicación ... necesita una actividad para hacer ese tipo de cosas ... – VallaDanger

+0

@ VallaDanger Proporcioné un verdadero fragmento de código de trabajo de la vida –

Cuestiones relacionadas