Вопрос

Этот намеренный сервис, который я создал, покажет тосты в OnStartCommand () и в Ondestroy (), но не в Onhandleintent (). Я что -то упускает в ограничениях намерения?

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!
}
}
Это было полезно?

Решение

Onhandleintent () вызывается из фонового потока (вот что такое Intentservice), поэтому вы не должны делать пользовательский интерфейс.

Другие советы

Принятый ответ не верен.

Вот как вы можете показать тост из onHandleIntent():

Создайте класс DisplayToast:

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

Создавать экземпляры а Handler в конструкторе вашего сервиса и позвоните post Метод с DisplayToast объект внутри.

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!"));

}
}

Вы должны начать тост в главной ветке:

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

Это связано с тем, что в противном случае нить ухода на intents service до того, как тост может быть отправлен, вызывая нелегальную статуэкспением:

java.lang.illegalstateexception: Handler (android.os.handler) {12345678} Отправка сообщения в обработчик в мертвом потоке

Другой вариант Rxjava, например:

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

Предостережение: Я новичок в Android.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top