Android 在服务的线程中显示吐司
嗨,我知道这个话题有很多答案。但我试了很多,但都没用。我想展示一个服务线程中的祝酒词。我怎样才能解决这个问题。使用getApplicationContext()等不起作用 我从活动(无边界)启动服务Android 在服务的线程中显示吐司,android,multithreading,service,toast,Android,Multithreading,Service,Toast,嗨,我知道这个话题有很多答案。但我试了很多,但都没用。我想展示一个服务线程中的祝酒词。我怎样才能解决这个问题。使用getApplicationContext()等不起作用 我从活动(无边界)启动服务 谢谢大家! 您必须启动线程: new Thread(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(
谢谢大家! 您必须启动线程:
new Thread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),"Your message",Toast.LENGTH_LONG).show();
}
}).start();
成员变量
onStartCommand(){
context = getApplicationContext)
}
在启动线程之前获取对上下文的引用
new Thread(new Runnable() {
@Override
public void run() {
Toast.makeText(context,"Your message",Toast.LENGTH_LONG).show();
}
}).start();
好了
改为使用有助于上下文管理的AsyncTask
使用UI线程显示您的祝酒词
new Thread(new Runnable() {
@Override
public void run() {
// SHOW TOAST
activity.runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(yourContext, "Hello from UI-thread", Toast.LENGTH_SHORT).show();
}
});
//... start DB work
}
}).start();
如果您无法访问某个活动,请按以下方式执行:
new Thread(new Runnable() {
@Override
public void run() {
// no activity, so use Handler & mainlooper
new Handler(Looper.getMainLooper()).post(
new Runnable() {
public void run() {
// yourContext is Activity or Application context
Toast.makeText(yourContext, "Hello from UI-thread", Toast.LENGTH_SHORT).show();
}
}
);
//... start DB work
}
}).start();
看看这个:
看看这是否可行您不能从非ui线程显示Toast。不要对明显正确的答案投反对票。你只是因为没有从中获益而对答案投反对票吗?我想知道是谁以这种方式否决了所有答案?你的解决方案行不通。当应用程序到达Toast.makeText(上下文,“您的消息”,Toast.LENGTH_LONG).show()点时;应用程序崩溃。是的,此解决方案存在缺陷。它将尝试在背景线程的上下文中显示祝酒词。我将接受什么作为活动?我有几项活动,但我不能上课。那你的背景呢?我更新了我的答案。如果没有活动引用,请使用处理程序。这将给出
java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序
new Thread(new Runnable() {
@Override
public void run() {
// SHOW TOAST
activity.runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(yourContext, "Hello from UI-thread", Toast.LENGTH_SHORT).show();
}
});
//... start DB work
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
// no activity, so use Handler & mainlooper
new Handler(Looper.getMainLooper()).post(
new Runnable() {
public void run() {
// yourContext is Activity or Application context
Toast.makeText(yourContext, "Hello from UI-thread", Toast.LENGTH_SHORT).show();
}
}
);
//... start DB work
}
}).start();
Handler h = new Handler(context.getMainLooper());
h.post(new Runnable() {
@Override
public void run() {
Toast.makeText(context,message,Toast.LENGTH_LONG).show();
}
});