【问题标题】:Threading error "Can't create handler inside thread that has not called Looper.Prepare" with Android线程错误“无法在未调用 Looper.Prepare 的线程内创建处理程序”与 Android
【发布时间】:2011-06-03 21:03:57
【问题描述】:

我目前正在开发一个 Android 应用程序,我需要在其中执行一个线程内的方法。我有以下代码来创建线程并执行

new Thread(new Runnable() { 
      @Override
      public void run() {
          new DownloadSync(getApplicationContext());
      }
}).start();

当我尝试运行此代码时,它会在日志 cat 中显示错误消息:

java.lang.RuntimeException: 无法在未调用 Looper.Prepare() 的线程内创建处理程序。

我该如何解决这个问题?

【问题讨论】:

    标签: android


    【解决方案1】:

    使用AsyncTask。你的处境是它存在的理由。另外,请阅读Painless Threading(主要使用 AsyncTask)。

    您的代码的问题是在您的新线程内部尝试使用Handler,但没有告诉Looper 准备。

    【讨论】:

    • 我想 Looper 将由 Activity 本身创建,但线程过早地运行。它还处理来自该线程的 UI,而不是 UI 线程,但这是另一回事。
    【解决方案2】:

    我有一个较早的答案不是很有帮助 - 我已将其删除并保留了相关位:

    确保您的 DownLoadSync 对象仅通过处理程序与主 UI 线程通信(如果您想避免使用 AsyncTask) 声明一个runnable和一个handler,如图所示:

    final Runnable updateMainUIThread = new Runnable() {
            public void run() {
                Toast.makeText(getBaseContext(), "Communicating with the main thread!!", Toast.LENGTH_LONG).show();
            }
        };
    
    
    private final Handler handler = new Handler();`
    

    并像这样使用它: handler.post(updateMainUIThread);

    【讨论】:

    • 您对与声明相同的代码段的评论毫无意义。该声明导致编译的匿名类。在 new 返回的临时引用上调用 start() 是完全可以的。
    • 没错,但它又可怕又乱。真正的答案在最后一行。事实上,我开始完全避免匿名内部课程,因为它们看起来像狗早餐(而且很难理解)
    猜你喜欢
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    相关资源
    最近更新 更多