最近使用AutoService库,做组件化的接口时,一直找不到接口的实现类,多次测试无果,但是每次发现log中都有如下log,
W/ActivityThread: ClassLoader.getResources: The class loader returned by Thread.getContextClassLoader() may fail for processes that host multiple applications. You should explicitly specify a context class loader. For example: Thread.setContextClassLoader(getClass().getClassLoader());
搜索后得知,如果多进程时,classloader会找不到这个的类,按照搜索来的方法增加了如下一段语句。
Thread.currentThread().setContextClassLoader(tClass.getClassLoader());
public static <T> t getService(Class<T> tClass){
Thread.currentThread().setContextClassLoader(tClass.getClassLoader());
try {
return ServiceLoader.load(service).iterator().next();
} catch (Exception e) {
return null;
}
}
经过测试,发现能够找到实现类了。
究其原因,是因为我使用了shareuserid,另外,如果设了多进程即在manifest中增加process属性,也是相同现象。
在进行组件化接口开发时遇到ServiceLoader无法找到接口实现类的问题,原因是Thread.getContextClassLoader()在多应用程序进程中可能失效。解决办法是显式设置ContextClassLoader,例如使用Thread.setContextClassLoader(getClass().getClassLoader())。该问题在使用shareuserid或在AndroidManifest.xml中配置多个进程(process属性)时也会出现。
766

被折叠的 条评论
为什么被折叠?



