在HttpResponseCache
的文档中有一个部分:
使用早期版本
这个类是在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上的问题(例如这里)和网络上的例子中的反思来看到这个电话。我还接管了包含这个确切片段的代码来设置缓存(包括注释,所以可能只是复制)。然而,我不太明白为什么你必须在这里使用反射。
通常,当我想使用在我定义的minSdkVersion
之上的某个API级别添加的方法时,我会使用以下模式:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
// do something here
}
那么为什么这不是CCD_ 3的默认模式呢。使用反射的优点是什么?它当然不会增加我代码的可读性。当以这种方式使用反射时,HttpResponseCache
实际上在ICS以下工作吗?
编辑:我这里没有旧的Android设备,我的模拟器根本拒绝启动,所以我现在不能简单地测试它。也许它只是在没有反思的情况下可怕地崩溃了。
使用反射的优点是什么?
首先,引用文档:
这个类是在Android 4.0(冰淇淋三明治)中添加的。
"被添加"是指"被添加到Android SDK中",而"冰淇淋三明治"实际上是指基于其余JavaDocs的Android 3.2(API 13级)。
然而,HttpResponseCache
类本身在框架中存在的时间更长,希望是在Android1.0给出建议之后。然而,该类是用@hide
注释标记的,因此直到API 13级才能被应用程序直接使用。
使用Build
的Java版本保护块将避免在旧设备上直接引用此类。然而,它实际上也没有在旧设备上配置缓存。他们的方法将适用于所有版本的Android,并允许您配置缓存,因为该类从一开始就存在。
谷歌很少明确授权使用反射以这种方式访问隐藏的类或方法,这就是为什么你在官方文档中不经常看到它的原因。
很遗憾,您的建议不适用于旧版本。思考以下内容。他们在新版本中添加了方法install(File, long)
。但是调用这个方法的代码被打包到另一个jar中。
现在您有了包含HttpResponseCache
的旧版本jar和调用它的新版本jar
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
cache.install(file, number);
}
即使if的表达式为false,也会抛出NoSuchMethodError
。使用反射是一种丑陋但有用的技术来防止这种情况。