我有一个方法可以从库项目中创建和调用方法。库方法从资源加载数据。我在工作线程上执行此操作,并且在执行此操作时切勿触摸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消息。 为了完整起见,我将资源移至库中以与服务共享。当资源在应用程序项目中时,这很好。它现在才抛出这个异常,因为我把它移到了库项目中。
此外
如果我注释掉工作线程的使用并在主线程上执行调用,它就可以了!但是我想在后台线程上执行此操作,后者仍会抛出异常。
答案 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
方法。