在传统Java中,我们常使用ClassLoader.getResourceAsStream 通过资源名称来获取资源,但是在Android中,使用该方法会对性能产生非常大的影响,在有关统计中,最高可以延时达到2000ms以上,所以对于Android应用,强烈建议使用安卓提供的Resources.get*(resId) 函数,这么关于如何计算一个函数的处理时间,我们后面会介绍。
为什么ClassLoader.getResourceAsStream 对性能有那么严重的影响?
关于这个问题,我们只要理解该方法的执行过程就一目了然了:
(1) 以 zip 压缩包的方式打开 APK 文件,为 APK 内的所有内容建立索引;
(2) 再次打开 APK 文件,并再次索引所有的内容;
(3) 校验 APK 文件被正确的进行了签名操作。
都是一些非常耗时的操作,导致了该方法在Android上不被推荐
为什么推荐使用Resources.get(resId) 方法?
这个问题,其实很好理解,Android对资源文件会提前做好单独的索引和加载机制,调用改方法是,只需要按图索骥就可以,不涉及压缩和签名等问题
详细请参考:揭秘在安卓平台上奇慢无比的 ClassLoader.getResourceAsStream,在项目中遇到了性能问题,故记录之。