Glide与RecyclerView结合的预加载器
之前在写漫画阅读器的时候,用的是 RecyclerView + Glide + PhotoView 的方式来加载图片,RecyclerView 的可横可竖的特性非常适合用来写漫画的阅读器。而这个库作用就是通过监听RecyclerView的滑动来进行图片的预加载。
1 | //glide 预加载 |
Glide添加解析的DNS
这个需求是在显示哔咔漫画图片时出现的问题,哔咔漫画显示图片时需要将域名替换成之前从服务器列表选择的ip地址,所以就需要通过往网络请求中添加解析DNS来实现。
首先要引入 Glide Okhttp 插件,这个插件允许开发者可以使用自定义的OkHttp3来替换Glide默认的Okhttp加载器。而 DNS的解析则是需要通过okhttp实现。
1 | class ComicModelLoader : ModelLoader<String, InputStream> { |
重点就是将 PicaThumbDns
加载到 OkClient 中。
至于 Glide的ModeLoader
使用可以参考官方教程
Glide 使用 OSS 图片
除去使用 阿里OSS 提供的SDK之外,也可以通过在请求的header中添加 Authorization 来进行请求,基本使用方法也是通过自定义 ModelLoader
来实现。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
class BgmGlideModule : AppGlideModule() {
override fun applyOptions(context: Context, builder: GlideBuilder) {
}
override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
registry.append(OssCoverBean::class.java, InputStream::class.java, Factory())
}
class Factory : ModelLoaderFactory<OssCoverBean, InputStream> {
override fun build(multiFactory: MultiModelLoaderFactory): ModelLoader<OssCoverBean, InputStream> {
return BgmModelLoader(multiFactory.build(GlideUrl::class.java,InputStream::class.java))
}
override fun teardown() {}
}
}
class BgmModelLoader(private val urlLoader: ModelLoader<GlideUrl?, InputStream>) : ModelLoader<OssCoverBean, InputStream> {
override fun buildLoadData(model: OssCoverBean, width: Int, height: Int, options: Options): ModelLoader.LoadData<InputStream>? {
var cover = model.cover
val header = LazyHeaders.Builder()
val uri = URI(cover)
val path = uri.path
val headers: MutableMap<String, String> = HashMap()
val df = SimpleDateFormat("E, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH)
df.timeZone = TimeZone.getTimeZone("GMT")
headers["Date"] = df.format(Date())
val auth =
SignV2Utils.sign(headers,
"bangumi",
path,
"access",
"screct")
header.addHeader(AUTHORIZATION, auth)
header.addHeader("Date", headers["Date"]!!)
val glideUrl = GlideUrl(cover, header.build())
return urlLoader.buildLoadData(glideUrl, width, height, options)
}
override fun handles(model: OssCoverBean): Boolean {
return model.cover.isNotEmpty()
}
}
在 Android 上获取GMT时需要指定 Locale.ENGLISH, 因为有些机型默认中文返回的日期是汉字年月日的格式,放在header上就是出错。