在IntentService中创建的Toast永远不会消失

jax*_*jax 29 android

我有一个下载一些文件的IntentService.问题是我在IntentService中创建了一个Toast

Toast.makeText(getApplicationContext(), "some message", Toast.LENGTH_SHORT).show();
Run Code Online (Sandbox Code Playgroud)

如果我退出应用程序,Toa​​st将永远不会消失.摧毁它的唯一方法就是杀死这个过程.

我究竟做错了什么?

ron*_*y l 74

问题是IntentService没有在主应用程序线程上运行.你需要获得一个Handler主线程(in onCreate())并将Toast其作为一个发布到它Runnable.

以下代码应该做的伎俩:

@Override
public void onCreate() {
    super.onCreate();
    mHandler = new Handler();
}

@Override
protected void onHandleIntent(Intent intent) {
    mHandler.post(new Runnable() {            
        @Override
        public void run() {
            Toast.makeText(MyIntentService.this, "Hello Toast!", Toast.LENGTH_LONG).show();                
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

  • 不,不是.http://developer.android.com/reference/android/os/Handler.html (8认同)
  • @rkmax android studio由于某种原因默认为`import java.util.logging.Handler;`(这是抽象的)将其更改为`import android.os.Handler;` (6认同)

Ton*_*Ton 23

这对我有用:

public void ShowToastInIntentService(final String sText) {
    final Context MyContext = this;

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


blu*_*way 8

IntentService将创建一个线程来处理新的intent,并在任务完成后立即终止它.因此,Toast将不受死线控制.

当屏幕上显示toast时,您应该在控制台中看到一些例外.


Ric*_*ler -9

您不应该Toast从 a 创建 s Service。你应该使用 aNotification来代替。

  • 错误的。来自http://developer.android.com/guide/topics/ui/notifiers/toasts.html“可以从活动或服务创建和显示toast”。它不起作用,因为“服务”在主线程上运行,而“意图服务”在另一个线程上运行。 (13认同)
  • 仅仅因为你可以做某事并不意味着你应该做某事。您不应该从服务创建 toast。 (6认同)