如何在 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,您正试图在AsyncTaskdoInBackground() 中更新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?

Android中使用Thread线程与AsyncTask异步任务的区别

图文|Android 使用Thread 和多线程使用互斥锁

Android多线程分析之二:Thread的实现

android中asynctask和thread的区别