嗨,我知道这个话题有很多答案。但我尝试了很多,但它没有用。我想在服务的一个线程中显示一个吐司。我怎么解决这个问题。使用getApplicationContext()等并不起作用。
我从一个Activity(无边界)启动服务。
public class CarDataService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
...
startThreadUpdatingDatabase();
Toast.makeText(this, message, Toast.LENGTH_LONG).show(); //it works
}
private void startThreadUpdatingDatabase(){
Log.d("Database", "startThreadUpdatingDatabase(was called)");
new Thread(new Runnable() {
public void run(){
..
// here i want to use a toast!!!
}
}).start();
}
}
谢谢!
答案 0 :(得分:1)
你必须开始这个主题:
new Thread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),"Your message",Toast.LENGTH_LONG).show();
}
}).start();
答案 1 :(得分:1)
public Contect context;
成员变量
onStartCommand(){
context = getApplicationContext)
}
在启动线程
之前获取对上下文的引用 new Thread(new Runnable() {
@Override
public void run() {
Toast.makeText(context,"Your message",Toast.LENGTH_LONG).show();
}
}).start();
然后你去了
使用AsyncTask代替上下文管理
答案 2 :(得分:1)
使用UI-Thread显示你的Toast
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();
答案 3 :(得分:1)
Handler h = new Handler(context.getMainLooper());
h.post(new Runnable() {
@Override
public void run() {
Toast.makeText(context,message,Toast.LENGTH_LONG).show();
}
});
看看这是否成功