IntentService不会显示Toast

Ten*_*r04 25 android intentservice android-toast

我创建的这个IntentService将在onStartCommand()和onDestroy()中显示Toasts,但不在onHandleIntent()中显示.我错过了一些关于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!
}
}
Run Code Online (Sandbox Code Playgroud)

Jim*_* G. 67

接受的答案是不正确的.

以下是您可以通过以下方式展示吐司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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Handler在服务的构造函数中实例化a ,并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!"));

}
}
Run Code Online (Sandbox Code Playgroud)

  • 该死的聪明.我希望有一个堆栈溢出的tip机器人,所以我可以给你dogecoin一个很好的答案. (8认同)
  • Dianne Hackborne并没有说这是不可能的,只是说你不应该从后台线程做UI.传递上下文对象是一件很重要的事情,并且可能导致泄漏.接受的答案是最好的答案,而这个答案是一种解决方法. (3认同)

whl*_*hlk 23

你应该在主线程上启动Toast:

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

这是因为否则IntentService的线程在吐出之前退出,导致IllegalStateException:

java.lang.IllegalStateException:Handler(android.os.Handler){12345678}在死线程上向Handler发送消息


hac*_*bod 19

onHandleIntent()是从后台线程调用的(这就是IntentService的全部内容),所以你不应该从那里做UI.

  • 就是这样,谢谢!我在onStartCommand()中创建了一个处理程序字段,并将Toast发布到处理程序并且它工作正常. (2认同)