0

我有一个从库项目创建和调用方法的方法。library 方法从资源加载数据。我在工作线程上执行此操作,并且在执行此操作时从不触摸 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 消息。为了完整起见,我将资源移至图书馆以与服务共享。当资源在应用程序项目中时,这工作正常。自从我将其移至库项目后,它现在才抛出此异常。

此外

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

4

2 回答 2

0

如果你说new Handler()没有指定 aLooper它会尝试获取Looper当前线程的。常规工作线程没有循环器。

确定Looper哪个线程处理Messages / 执行Runnables

要么做

new Handler(Looper.getMainLooper());

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

请注意,您的工作线程中不能有一个内部线程,因为循环器通过等待新消息处理来Looper占用该方法。run

于 2012-12-20T16:45:35.087 回答
0

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

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

于 2012-12-20T16:31:01.903 回答