无法在未调用Looper.prepare()的线程内创建处理程序

时间:2012-12-20 16:09:32

标签: android exception shared-libraries

我有一个方法可以从库项目中创建和调用方法。库方法从资源加载数据。我在工作线程上执行此操作,并且在执行此操作时切勿触摸UI。进行调用的方法(在工作线程上)是:

private void testGetXData(){

try {

    Data data = new Data();
    String xsd = data.getXSD();
    importedData = xsd;

} catch (Exception e) {
    System.out.println(e.getMessage(););
}

}

并且异常发生在该行:

Data data = new Data();

Data是我的图书馆项目中的一个类。 importedData是模块级别的字符串。

修改

我没有直接使用处理程序。我所做的就是调用该方法:

new Thread(new Runnable() {
    public void run() {
        testGetXData();
    }
}).start();

我这样做是为了不阻止UI线程并获得可怕的ANR消息。 为了完整起见,我将资源移至库中以与服务共享。当资源在应用程序项目中时,这很好。它现在才抛出这个异常,因为我把它移到了库项目中。

此外

如果我注释掉工作线程的使用并在主线程上执行调用,它就可以了!但是我想在后台线程上执行此操作,后者仍会抛出异常。

2 个答案:

答案 0 :(得分:0)

我猜这条消息试图获取当前线程的处理程序并失败。为了能够在线程上创建处理程序,它需要一个Looper,默认的“Thread”实现没有。

扩展HandlerThread而不是Thread应解决问题。

答案 1 :(得分:0)

如果您在未指定new Handler()的情况下说Looper,则会尝试获取当前线程的Looper。普通工作线程没有活套。

Looper确定哪个线程处理Message s /执行Runnable s

要么

new Handler(Looper.getMainLooper());

如果要处理UI线程上的消息或创建可以处理消息的额外线程。请参阅HandlerThread,例如Android ANRs from code running in a Handler?

请注意,您的工作线程中不能有Looper,因为looper通过等待处理新消息来占用run方法。