在HttpResponseCache
的{{3}}中有一个部分:
使用早期版本
此类已添加到Android 4.0(冰淇淋三明治)中。使用 反射以启用响应缓存而不会影响先前 版本:
try { File httpCacheDir = new File(context.getCacheDir(), "http"); long httpCacheSize = 10 * 1024 * 1024; // 10 MiB Class.forName("android.net.http.HttpResponseCache") .getMethod("install", File.class, long.class) .invoke(null, httpCacheDir, httpCacheSize); } catch (Exception httpResponseCacheNotAvailable) { }
您可以在SO(例如documentation)上的问题中通过反思看到此调用,以及网络上的示例。我还接管了包含这个完整代码段的代码来设置缓存(包括注释,所以它可能只是copypasta)。但是,我不太明白为什么你必须在这里使用反射。
通常,当我想使用在我定义的minSdkVersion
之上的特定API级别添加的方法时,我会使用以下模式:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
// do something here
}
所以为什么这不是HttpResponseCache
的默认模式。使用反射有什么好处?它肯定不会增加我的代码的可读性。在使用反射时,HttpResponseCache
实际上是否在ICS之下工作?
编辑:我在这里没有旧的Android设备而且我的模拟器完全拒绝启动,因此我暂时无法对其进行测试。也许它只是在没有反思的情况下崩溃。
答案 0 :(得分:0)
使用反射有什么好处?
首先,引用文档:
此类已添加到Android 4.0(冰淇淋三明治)中。
通过"添加",他们的意思是"被添加到 Android SDK "和#34; Ice Cream Sandwich" ,它们的确意味着基于其他JavaDocs的Android 3.2(API Level 13)。
然而,HttpResponseCache
类本身已经存在于框架中更长时间,希望自Android 1.0给出他们的建议。但是,该类标有@hide
注释,因此在API级别为13之前,应用程序无法直接使用该类。
使用Build
的Java版本保护块将避免直接在旧设备上引用此类。但是,它实际上并不在旧设备上配置缓存。
他们的方法适用于所有版本的Android,并允许您配置缓存,因为该类从一开始就存在。
很明显,谷歌明确授权使用反射以这种方式获取隐藏的类或方法,这就是为什么你不经常在官方文档中看到它。
答案 1 :(得分:0)
不幸的是,您的建议不适用于旧版本。想想以下几点。他们在新版本中添加了方法install(File, long)
。但是调用此方法的代码被打包到其他jar中。
现在您拥有包含HttpResponseCache
的旧版jar和调用它的新版jar。如果你在那里写
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
cache.install(file, number);
}
即使if的表达式为false,也会抛出 NoSuchMethodError
。
使用反射是一种丑陋但有用的技术来防止这种情况。