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

时间:2010-07-21 05:56:43

标签: android

我有一个下载一些文件的IntentService。问题是我在IntentService中创建一个像这样的Toast

Toast.makeText(getApplicationContext(), "some message", Toast.LENGTH_SHORT).show();

如果退出应用,Toast将永远不会消失。摧毁它的唯一方法就是杀死这个过程。

我做错了什么?

6 个答案:

答案 0 :(得分:73)

问题是IntentService没有在主应用程序线程上运行。您需要为主要帖子获取Handler(在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();                
        }
    });
}

答案 1 :(得分:20)

这对我有用:

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

答案 2 :(得分:8)

IntentService将创建一个线程来处理新意图,并在任务完成后立即终止它。所以,吐司将不受一个死线控制。

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

答案 3 :(得分:1)

对于在Xamarin工作室开发的人来说,这就是它在那里所做的:

Handler handler = new Handler ();
handler.Post (() => {
    Toast.MakeText (_Context, "Your text here.", ToastLength.Short).Show ();
});

答案 4 :(得分:0)

当用户处于其中一个应用程序活动中时显示祝酒词。

只需要引用当前活动,并使用以下示例代码调用它:

public void showToast(final String msg) {
    final Activity a = currentActivity;
    if (a != null ) {
        a.runOnUiThread(new Runnable() {

            @Override
            public void run() {
                Toast.makeText(a, msg, Toast.LENGTH_SHORT).show();
            }
        });
    }
}

有很多选项可以获取当前活动,请查看以下问题: How to get current foreground activity context in android?

但我使用这种方法:

申请必须:

private Activity currentActivity = null;

public Activity getCurrentActivity() {
    return currentActivity;
}

public void setCurrentActivity(Activity mCurrentActivity) {
    this.currentActivity = mCurrentActivity;
}

每项活动必须:

@Override
protected void onResume() {
    super.onResume();
    ((MyApplication) getApplication()).setCurrentActivity(this);

}
@Override
protected void onPause() {
    super.onPause();
    ((MyApplication) getApplication()).setCurrentActivity(null);
}

答案 5 :(得分:-9)

您不应该从Toast创建Service。您应该使用Notification代替。