我有一个下载一些文件的IntentService。问题是我在IntentService中创建一个像这样的Toast
Toast.makeText(getApplicationContext(), "some message", Toast.LENGTH_SHORT).show();
如果退出应用,Toast将永远不会消失。摧毁它的唯一方法就是杀死这个过程。
我做错了什么?
答案 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
代替。