Java 如何从后台线程显示toast消息
考虑以下代码。在Java 如何从后台线程显示toast消息,java,android,Java,Android,考虑以下代码。在Service.onStart()方法中,我创建并启动了一个线程,该线程应该显示Toast消息,但它不工作 public class MyService extends Service{ private static final String TAG = "MyService"; @Override public IBinder onBind(Intent intent) { return null; }
Service.onStart()
方法中,我创建并启动了一个线程,该线程应该显示Toast消息,但它不工作
public class MyService extends Service{
private static final String TAG = "MyService";
@Override
public IBinder onBind(Intent intent)
{
return null;
}
@Override
public void onCreate()
{
Toast.makeText(this, "My Service Created", Toast.LENGTH_SHORT).show();
}
@Override
public void onDestroy()
{
Toast.makeText(this, "My Service Stopped", Toast.LENGTH_SHORT).show();
}
@Override
public void onStart(Intent intent, int startid)
{
Toast.makeText(this, "My Service Started", Toast.LENGTH_SHORT).show();
DBIteratorThread dbThread=new DBIteratorThread();
dbThread.myService=this;
Thread t1 = new Thread(dbThread);
t1.start();
}
}
class DBIteratorThread implements Runnable
{
MyService myService;
public void run()
{
// Toast.makeText(myService, "Thread is Running", Toast.LENGTH_SHORT).show();
}
}
用
getBaseContext()替换this
您应该能够使用getApplicationContext()方法获取用于显示Toast的上下文
有关这方面的一些精彩讨论,请参阅。我编写了一个类,用于显示来自后台进程的祝酒词。可以在任何地方使用,例如在异步任务
中。您只需创建此类的实例,如
ToastHandler mToastHandler = new ToastHandler(yourContext);
然后调用showtoos()
,使用您的文本或资源id和Toast的持续时间,就像您通常使用makeToast()
一样
以下是代码或直接下载:
在主/UI线程中执行UI填充。试试这个:
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
//Your UI code here
}
});
不能在非活动ui线程的线程上显示祝酒词。
如果使用runOnUiThread
方法使其在ui线程上运行,则只能在其他地方运行它
看看这个问题
我们使用handler实现此目的,因为它很容易…:)
步骤:
在主活动(onCreate)中声明处理程序
要在后台运行的类,用于创建参数化构造函数。将上下文作为一个边界
现在从主活动创建一个线程,并传递该活动的上下文
现在,从另一个线程(从您想要发送的任何线程)向处理程序发送Post
现在在Toast中使用此上下文,而不是使用getApplicationContext()
它运行良好
mhandler.post(new Runnable() {
public void run() {
Toast.makeText(context,"Run ends",Toast.LENGTH_LONG).show();
}
});
用getApplicationContext()
替换单词此
,然后会出现消息
Toast.makeText(this, "My Service Created", Toast.LENGTH_SHORT).show();
正确的:
Toast.makeText(getApplicationContext(), "My Service Created", Toast.LENGTH_SHORT).show();
这也适用于您Runnable()中“thread.interrupt()”和“thread=null”的用途是什么?将thread设置为null是多余的,因为当函数返回时,该变量将消失。我不是thread
专家。我只是想避免可能出现的问题或副作用
Toast.makeText(getApplicationContext(), "My Service Created", Toast.LENGTH_SHORT).show();