我有一个运行线程的Android应用程序。我希望Toast消息与消息一起显示。
当我这样做的时候,我得到了下面的异常:
日志目录跟踪:
FATAL EXCEPTION: Timer-0
java.lang.RuntimeException: Can't create handler inside thread that has not
called Looper.prepare()
at android.os.Handler.<init>(Handler.java:121)
at android.widget.Toast$TN.<init>(Toast.java:322)
at android.widget.Toast.<init>(Toast.java:91)
at android.widget.Toast.makeText(Toast.java:238)
有没有办法将Toast消息从线程推送到用户界面?
发布于 2013-09-23 05:15:43
我得到这个异常是因为我试图从后台线程中弹出一个Toast。
Toast需要一个活动来推送到用户界面,而线程没有。
因此,一种解决方法是为线程提供指向父活动的链接,并为其干杯。
将此代码放在要发送Toast消息的线程中:
parent.runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(parent.getBaseContext(), "Hello", Toast.LENGTH_LONG).show();
}
});
在创建此线程的后台线程中保留指向父活动的链接。在你的线程类中使用父变量:
private static YourActivity parent;
创建线程时,将父活动作为参数传递给构造函数,如下所示:
public YourBackgroundThread(YourActivity parent) {
this.parent = parent;
}
现在后台线程可以将Toast消息推送到屏幕上。
发布于 2015-06-06 17:19:52
Android基本上工作在两种线程类型上,即UI线程和后台线程。根据android文档-
不要从UI线程外部访问Android UI工具包为了解决这个问题,Android提供了几种从其他线程访问UI线程的方法。以下是可以提供帮助的方法列表:
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)
现在有各种各样的方法来解决这个问题。我将通过代码示例来解释它。
runOnUiThread
new Thread()
{
public void run()
{
myactivity.this.runOnUiThread(new runnable()
{
public void run()
{
//Do your UI operations like dialog opening or Toast here
}
});
}
}.start();
循环
用于为线程运行消息循环的类。默认情况下,线程没有与之关联的消息循环;要创建一个消息循环,请在要运行该循环的线程中调用prepare(),然后调用loop()使其处理消息,直到循环停止为止。
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
AsyncTask
AsyncTask允许您在用户界面上执行异步工作。它在工作线程中执行阻塞操作,然后在UI线程上发布结果,而不需要您自己处理线程和/或处理程序。
public void onClick(View v) {
new CustomTask().execute((Void[])null);
}
private class CustomTask extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... param) {
//Do some work
return null;
}
protected void onPostExecute(Void param) {
//Print Toast or open dialog
}
}
处理程序
处理程序允许您发送和处理与线程的MessageQueue相关联的消息和可运行对象。
Message msg = new Message();
new Thread()
{
public void run()
{
msg.arg1=1;
handler.sendMessage(msg);
}
}.start();
Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
if(msg.arg1==1)
{
//Print Toast or open dialog
}
return false;
}
});
发布于 2015-05-07 00:32:35
这是我一直在做的事情:
public void displayError(final String errorText) {
Runnable doDisplayError = new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(), errorText, Toast.LENGTH_LONG).show();
}
};
messageHandler.post(doDisplayError);
}
这应该允许从任一线程调用该方法。
其中messageHandler在活动中声明为..
Handler messageHandler = new Handler();
https://stackoverflow.com/questions/17379002
复制相似问题