Как да създадете тост от IntentService? Засяда на екрана

Опитвам се да накарам моята IntentService да показва съобщение Toast, но когато го изпращам от съобщението onHandleIntent, тостът се показва, но се забива и екранът никога не напуска. Предполагам, че това е така, защото методът onHandleIntent не се случва в нишката на основната услуга, но как мога да го преместя?

Някой имал ли е този проблем и разрешавал ли го е?


person Omri    schedule 17.10.2010    source източник
comment
Възможен дубликат на Toast, създаден в IntentService, никога не изчезва   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 13.02.2016


Отговори (3)


в onCreate() инициализирайте Handler и след това публикувайте в него от вашата нишка.

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")); 
}
person Nathan Schwermann    schedule 17.10.2010
comment
С какво е инициализиран вашият mContext? - person IgorGanapolsky; 04.10.2012
comment
Това е препратка към услугата. - person Nathan Schwermann; 04.10.2012
comment
тостът, приготвен по този начин, няма да изчезне. има ли нещо, което трябва да добавя освен кода по-горе? - person Yulong; 15.07.2013
comment
@Yulong, това е интересен бъг, винаги можете да запазите препратка към тоста и да извикате неговия cancel метод - person Nathan Schwermann; 15.07.2013
comment
@AvinashR за борба с този проблем, просто използвайте конструктора Handler, който приема Looper. mHandler = new Handler(Looper.getMainLooper()); - person Nathan Schwermann; 20.07.2014

Ето пълния код на IntentService Class, демонстриращ Toasts, който ми помогна:

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.");
    }
}
person Mike Shiyan    schedule 16.01.2016
comment
не е възможно да се създаде Toast с помощта на Application-Context ... имате нужда от дейност, за да правите такива неща ... - person VallaDanger; 20.01.2017
comment
@VallaDanger Предоставих реален работещ кодов фрагмент. - person Mike Shiyan; 31.01.2017

Използвайте Handle, за да публикувате Runnable, който съдържа вашата операция

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();
    }  
}); 
person zuoke    schedule 04.02.2015