Frage

Dieser Absichtserservice, den ich erstellt habe, werden Toast in OnStartCommand () und in OnDestroy () zeigen, aber nicht in OnhandLeiftent (). Fehlt mir etwas über die Einschränkungen eines Inventservice?

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!
}
}
War es hilfreich?

Lösung

onHandleTentent () wird aus einem Hintergrund -Thread aufgerufen (genau darum geht es in InventService), also sollten Sie von dort aus nicht die Benutzeroberfläche tun.

Andere Tipps

Die akzeptierte Antwort ist nicht korrekt.

Hier ist, wie Sie Toast von Toast zeigen können onHandleIntent():

Erstellen Sie eine 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();
    }
}

Instanziiert a Handler im Konstruktor Ihres Dienstes und rufen Sie die an post Methode mit a 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!"));

}
}

Sie sollten 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 liegt daran, dass der Thread des Inspektservice ansonsten beendet wird, bevor der Toast versendet werden kann, was zu einer illegalen StateException führt:

java.lang.illegalstateException: Handler (Android.os.Handler) {12345678} Sende Nachricht an einen Handler auf einem toten Thread

Eine andere Option ist Rxjava, z.B:

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 in Android.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top