Android 处理程序无法将消息或可运行消息传递到主线程

Android 处理程序无法将消息或可运行消息传递到主线程,android,user-interface,multithreading,Android,User Interface,Multithreading,我有一个应用程序有两个线程-主线程和数据加载器。当数据加载器完成时,它将一个可运行对象发布到主线程(如DevGuide中所述),但它从未被交付和运行 以下是基本代码: class MyApp extends Application { public void onCreate() { LoaderThread t = new LoaderThread(); t.start(); } private class LoaderThread

我有一个应用程序有两个线程-主线程和数据加载器。当数据加载器完成时,它将一个可运行对象发布到主线程(如DevGuide中所述),但它从未被交付和运行

以下是基本代码:

class MyApp extends Application
{
   public void onCreate()
   {
         LoaderThread t = new LoaderThread();
         t.start();
   }

   private class LoaderThread extends Thread
   {
        public void run()
        {
             SystemClock.sleep(2000);
             boolean res = m_handler.post(m_runnable);
             if(res)
                Log.d(TAG, "Posted Runnable");
        }
   }

   private final Handler m_handler = new Handler();
   private final Runnable m_runnable = new Runnable() {
             public void run()
             {
                 Log.d(TAG, "Hey, i'm runnable!");
             }
        }
}
另外,需要注意的是,我将此代码作为从ApplicationTestCase派生的单元测试运行:

class MyAppTest : public ApplicationTestCase
{
     public MyAppTest()
     {
          super(MyApp.class);
     }

     public void testLoading()
     {
          createApplication();
          // few asserts follow here...
     }
}
所以这失败了。Runnable从未调用run(),尽管日志表明它已成功发布。 我还尝试发送简单的消息,而不是发布可运行的消息(例如m_handler.sendEmptyMessage(1))——它们永远不会被传递到主线程中处理程序的回调

我错过了什么


提前感谢:)

处理程序只在
活动中工作。您正试图在
应用程序中使用它

一个
处理程序
需要一个才能工作。
循环器提供
处理程序所需的消息队列

Activity
的所有实例都有一个
Looper
,因为其中一个用于处理UI事件,但您可以在其他地方创建
Looper
的实例

查看您的日志输出,看看Android是否在抱怨缺少
活套

如果是,您可以通过将以下内容添加到
onCreate()
方法的顶部进行修复:

Looper.prepare(); 
m_handler = new Handler();
Looper.run();

并从代码的后面删除
m_handler
的初始化。

调用
Looper.prepare()
的替代方法是调用
新处理程序(Looper.getMainLooper())
。调用
Looper.prepare()
的问题是,当线程上已经有一个循环器时,它将抛出一个异常。您可能正在编写必须在不同环境下运行的代码,此解决方案将处理更多情况

见:

我刚刚发现,这段代码在操作系统中作为应用程序运行时可以工作,但在作为测试运行时失败。。。所以我想这是另一个遗漏。也许与活动有关…我想是的,但活套确实是被创造出来的。因为当我尝试自己创建它(包括尝试上面的建议)时,我得到了:“java.lang.RuntimeException:每个线程只能创建一个循环器”,而且我刚刚发现,当在操作系统中的一个成熟应用程序中运行时,代码(未更改)工作正常。另一方面,当我将其作为测试用例运行时,它无法工作。。。有什么提示吗?Looper是正常的,它不是空的,没有异常,日志中没有错误。我很困惑。谢谢你的提示!我的代码不在活动中,因此不在循环器中。。。我试图弄明白为什么通过处理程序发送的消息只有在调用线程停止时才被传递。