IntentService zeigt Toast nicht an

Dieser IntentService, den ich erstellt habe, zeigt Toasts in onStartCommand () und in onDestroy (), aber nicht in onHandleIntent (). Bin ich etwas über die Einschränkungen eines IntentService?

public class MyService extends IntentService { private static final String TAG = "MyService"; public MyService(){ super("MyService"); } @Override protected void onHandleIntent(Intent intent) { cycle(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show(); //This happens! return super.onStartCommand(intent,flags,startId); } @Override public void onCreate() { super.onCreate(); } @Override public void onDestroy() { Toast.makeText(this, "service stopping", Toast.LENGTH_SHORT).show(); //This happens! super.onDestroy(); } private void cycle(){ Toast.makeText(this, "cycle done", Toast.LENGTH_SHORT).show(); //This DOESN'T happen! Log.d(TAG,"cycle completed"); //This happens! } } 

  • Aufblasen von Layout-XML auf benutzerdefinierte LinearLayout erstellt redundante LinearLayout-Ansicht
  • Android NDK - unterstützt es gerade ARM Code oder einfach nur Thumb
  • Wie man Gedächtnis mit Android-Studio zu analysieren
  • Google Analytics easytracker verursacht Java-Ausnahme
  • Android und Planet Rendering
  • Wie soll ich Server-Timeouts und Fehlercode-Antworten auf einen http-Beitrag in Android App behandeln?
  • Integrieren Espresso mit Proguard und Gradle
  • Sicherheit mit SharedPreferences
  • Verschieben Sie Google Logo in MapView
  • Filtern Sie Google Places autovervollständige Ergebnisse nach Land
  • Android: Animation in der Galerieansicht?
  • Kann ich so etwas wie "tooltip" für eine ansicht in android setzen?
  • 4 Solutions collect form web for “IntentService zeigt Toast nicht an”

    OnHandleIntent () wird von einem Hintergrund-Thread (das ist, was IntentService ist alles über), so dass Sie sollten nicht UI von dort aus.

    Die akzeptierte Antwort ist nicht korrekt.

    Hier kannst du Toast von onHandleIntent() :

    Erstellen einer DisplayToast-Klasse :

     public class DisplayToast implements Runnable { private final Context mContext; String mText; public DisplayToast(Context mContext, String text){ this.mContext = mContext; mText = text; } public void run(){ Toast.makeText(mContext, mText, Toast.LENGTH_SHORT).show(); } } 

    Instantiate einen Handler in Ihrem Service-Konstruktor und rufen Sie die post Methode mit einem DisplayToast Objekt im Inneren.

     public class MyService extends IntentService { Handler mHandler; public MyService(){ super("MyService"); mHandler = new Handler(); } @Override protected void onHandleIntent(Intent intent) { mHandler.post(new DisplayToast(this, "Hello World!")); } } 

    Du solltest den Toast auf dem Hauptfaden starten:

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

    Dies ist, weil sonst der Thread des IntentService beendet wird, bevor der Toast ausgesendet werden kann, was eine IllegalStateException verursacht:

    Java.lang.IllegalStateException: Handler (android.os.Handler) {12345678} Senden einer Nachricht an einen Handler auf einem toten Thread

    Eine weitere Option ist RxJava , zB:

     private void showToast(final String text) { Observable.just(text) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<String>() { @Override public void call(String s) { Toast.makeText(getApplicationContext(), s, Toast.LENGTH_LONG).show(); } }); } 

    Vorbehalt : Ich bin neu für Android.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.