2010-10-17 11 views
25

Staram się, aby moja IntentService wyświetlała komunikat Toast, , ale wysyłając go z wiadomości onHandleIntent, toast pokazuje się, ale utknie i ekran się nie opuszcza. Zgaduję, ponieważ metoda onHandleIntent nie występuje w głównym wątku usługi, ale jak mogę go przenieść?Jak utworzyć toast z IntentService? Utknął na ekranie

Czy ktoś ma ten problem i rozwiązał go?

+0

Możliwy duplikat [Toast stworzył w IntentService nigdy nie odejdzie] (http://stackoverflow.com/questions/3296639/toast-created-in-an-intentservice-never-goes-away) –

Odpowiedz

32

w onCreate() zainicjować Handler, a następnie opublikować go z wątku.

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

Do czego jest zainicjowany twój mContext? –

+0

Jest to odniesienie do usługi. – schwiz

+0

toast zrobiony w ten sposób nie zniknie. czy jest coś, co powinienem dodać oprócz kodu powyżej? – Yulong

3

pomocą uchwytu aby umieścić Runnable których zawartość operacja

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

Oto pełny kod IntentService Klasa wykazując grzanki, które pomogły mi:

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

nie można utworzyć toastu za pomocą kontekstu aplikacji ... potrzebne jest działanie, aby wykonać tego rodzaju czynności ... – VallaDanger

+0

@VallaDanger Dostarczyłem -żywotny fragment kodu. –