【问题标题】:How to use toast message inside Thread in Android如何在 Android 的 Thread 中使用 toast 消息
【发布时间】: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() 代码。

标签: android multithreading


【解决方案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();
            }
            

            【讨论】:

              猜你喜欢
              • 2011-07-15
              • 1970-01-01
              • 2015-05-31
              • 2020-10-10
              • 2015-04-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-01-07
              相关资源
              最近更新 更多