2010-10-17 14 views
25

Sto cercando di far visualizzare il mio IntentService a un messaggio Toast, ma quando lo si invia dal messaggio onHandleIntent, il brindisi si mostra ma rimane bloccato e lo schermo non viene mai lasciato. Sto indovinando perché il metodo onHandleIntent non si verifica sul thread del servizio principale, ma come posso spostarlo?Come creare un toast da IntentService? Si blocca sullo schermo

Qualcuno ha questo problema e risolto?

+0

Eventuali duplicati di [Toast creato in un IntentService non scompare mai] (http://stackoverflow.com/questions/3296639/toast-created-in-an-intentservice-never-goes-away) –

risposta

32

in onCreate() inizializzare uno Handler e quindi postarlo dal thread.

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 cosa è stato inizializzato il tuo mContext? –

+0

È un riferimento al servizio. – schwiz

+0

il pane tostato fatto in questo modo non andrà via. c'è qualcosa che dovrei aggiungere tranne il codice sopra? – Yulong

3

usare la maniglia per inviare un Runnable quali contenuti l'operazione

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

Ecco il codice completo IntentService classe dimostrando brindisi che mi hanno aiutato:

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

non è possibile creare un Toast utilizzando un Application-Context ... è necessaria un'attività per fare quel tipo di cose ... – VallaDanger

+0

@VallaDanger Ho fornito un vero -life snippet di codice funzionante. –