如何在 Android 的 Thread 中使用 toast 消息
Posted
技术标签:
【中文标题】如何在 Android 的 Thread 中使用 toast 消息【英文标题】:How to use toast message inside Thread in Android 【发布时间】:2013-09-16 06:47:07 【问题描述】:当我在 Thread 类的 run 方法中使用 Toast 时遇到一些问题。
我的错误Logcat
09-16 11:42:38.140: E/androidRuntime(1446): in writeCrashedAppName, pkgName :com.monday.worker_android
09-16 11:59:17.920: E/AndroidRuntime(2144): FATAL EXCEPTION: AsyncTask #1
09-16 11:59:17.920: E/AndroidRuntime(2144): java.lang.RuntimeException: An error occured while executing doInBackground()
09-16 11:59:17.920: E/AndroidRuntime(2144): at android.os.AsyncTask$3.done(AsyncTask.java:200)
09-16 11:59:17.920: E/AndroidRuntime(2144): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
09-16 11:59:17.920: E/AndroidRuntime(2144): at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
09-16 11:59:17.920: E/AndroidRuntime(2144): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
09-16 11:59:17.920: E/AndroidRuntime(2144): at java.util.concurrent.FutureTask.run(FutureTask.java:138)
09-16 11:59:17.920: E/AndroidRuntime(2144): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
09-16 11:59:17.920: E/AndroidRuntime(2144): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
09-16 11:59:17.920: E/AndroidRuntime(2144): at java.lang.Thread.run(Thread.java:1019)
09-16 11:59:17.920: E/AndroidRuntime(2144): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
09-16 11:59:17.920: E/AndroidRuntime(2144): at android.os.Handler.<init>(Handler.java:121)
09-16 11:59:17.920: E/AndroidRuntime(2144): at android.widget.Toast.<init>(Toast.java:75)
09-16 11:59:17.920: E/AndroidRuntime(2144): at android.widget.Toast.makeText(Toast.java:244)
09-16 11:59:17.920: E/AndroidRuntime(2144): at com.monday.worker_android.SwipePage$2.doInBackground(SwipePage.java:142)
09-16 11:59:17.920: E/AndroidRuntime(2144): at com.monday.worker_android.SwipePage$2.doInBackground(SwipePage.java:1)
09-16 11:59:17.920: E/AndroidRuntime(2144): at android.os.AsyncTask$2.call(AsyncTask.java:185)
09-16 11:59:17.920: E/AndroidRuntime(2144): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
但是当我忽略 Toast 时,它工作正常。但我想使用它。请帮忙。
【问题讨论】:
你需要在 UI 线程中调用它。 使用处理程序在后台线程中显示 toast。 考虑使用 AsyncTask onPostExecute() 方法来显示 Toast。 你能把你的代码放上来吗? 发布您的doInBackground()
代码。
【参考方案1】:
通过从您的线程调用 Activity 的 runOnUiThread 方法:
activity.runOnUiThread(new Runnable()
public void run()
Toast.makeText(activity, "Toast message inside Thread", Toast.LENGTH_LONG).show();
);
【讨论】:
【参考方案2】:您必须在 UI 线程上调用 Toast。
AsyncTask onPostExecute 在 UI 线程上运行。如果你想“强制”一个 UI 线程,你可以在 onBackground 中使用下面的代码:
// code runs in a thread
runOnUiThread(new Runnable()
@Override
public void run()
Toast.makeText(....).show();
);
【讨论】:
【参考方案3】:您不能在非 UI 线程中使用或访问任何 UI 元素。如果您想查看有关线程的一些消息,那么您可以使用 AsyncTask 并使用 preExecute 方法中的 UI 内容。因为 AsyncTask 的 pre 和 postExecute 是在 UI 线程上运行的。
如果您想这样做,请查看Problem with Toast in AsyncTask method call。
如果您要排除一种小而简单的方法,则只需使用 LOG 类,例如:
Log.d("String Key", "the value you want to see");
如果您想了解有关日志的一些想法,请参阅Android Log.v(), Log.d(), Log.i(), Log.w(), Log.e() - When to use each one?
希望这些足以解决您的问题。
【讨论】:
我已经给了你一些方法和链接,你也可以在这里看到其他答案,比如 jay 、pratic 和 sergi 来使用 runOnUiThread。所有答案都有帮助。【参考方案4】:根据您的logcat
,您正试图在AsyncTask
的doInBackground()
中更新UI part (using Toast)
这是不可能的直接
在onPostExecute()
中使用相同的handling/updating UI Part
如果你想展示 Toast in doInbackground()
包装 Toast in runOnUIThread()
但这不是最好的解决方案。
喜欢
runOnUiThread(new Runnable()
@Override
public void run()
// Show Toast Here
);
【讨论】:
【参考方案5】:您可以如下显示您的 Toast 消息:
YourActivityName.this.runOnUiThread(new Runnable()
@Override
public void run()
Toast.makeText(YourActivityName.this, "This is Toast!!!", Toast.LENGTH_SHORT).show();
);
【讨论】:
【参考方案6】:你不能在 Thread 中打印 Toast,因为 Thread 是在后台运行的,它不会影响 GUI 的东西。您必须使用 UI 线程来完成。
runOnUiThread(new Runnable()
@Override
public void run()
Toast.makeText(this, "YOUR MESSAGE TO PRINT", Toast.LENGTH_LONG).show().
);
【讨论】:
【参考方案7】:你需要在onPostExecute()
方法中调用toast
@Override
protected void onPostExecute(Boolean result)
super.onPostExecute(result);
Toast.makeText(context, "Message", Toast.LENGTH_SHORT).show();
【讨论】:
以上是关于如何在 Android 的 Thread 中使用 toast 消息的主要内容,如果未能解决你的问题,请参考以下文章
eclipse中做android游戏如何创建Thread(线程)
如何在tid xxxxx(Thread-X)中解决Android致命信号11(SIGSEGV),代码1,故障地址0x0?