*****
**開始使用**
[TOC=6]
# 1. 為什么使用Glide?
**1. 首先圖片加載框架存在的問題**
需要自己封裝HTTPURLConnection
需要自己封裝三級緩存
需要自己ListView圖片錯位問題
。。。存在很多問題
那么這些問題怎么解決呢?
有一幫哥們搞了一下框架如:
~~~
afinal的afinalBitmap
Xutils的BitmapUtils
universalImageLoader
square的picasso
google推薦的glide
FaceBook推出的fresco
~~~
**2. 為什么要選擇Glide**
首先來分析下,一個優秀的圖片庫應該具有什么樣的特性?
* 易用性。這對于絕大多數開源庫而言,都是需要做到的,但這又是很難的一方面。舉個例子,圖片庫涉及到網絡、緩存、編碼等等各個環節,但這些環節不應該讓所有用戶都知曉,應該拿捏到這種力度:用戶可以不知曉,有需求的可以進行自定義。開源庫可能有很多類用戶可以涉及,但最好有統一的外觀(Facade Pattern),Glide 在這點上就做得足夠好。
* 擴展性。需求這東西嘛,總是比天氣變化快多了,設計的開源庫就必須得有很好的擴展性。無論是 Volley,Glide 還是其他知名開源庫,在這點上都做得很好。關鍵在于抽象::不變的與變化的::,變化的是 `網絡`,`編碼`和`緩存`等等模塊,不變的是它們之間是如何銜接的。在合理的抽象建模下,還是很容易高的擴展性的。
* 高性能與低占用。這是圖片庫最核心的部分,也是最難的部分。難點在于三個方面。
* 內存受限。受限于移動終端的低內存,如果占用內存過大,會使得分配變得低效,不穩定。如果復用不給力,高頻率的分配內存,會導致GC頻繁,從而卡頓。
* 流暢性。Android 系統中的圖片常用于 RecyclerView,GridView 中,這些控件往往展示著大量的圖片,在這些圖片頻繁加載、編碼等等情況下,保證滑動流暢呢?
* 生命周期。Android的UI組件有各個周期,Glide 要在盡可能少入侵代碼的前提下,參與到生命周期里面去,從而合理地分配和釋放資源。
Glide完全具備這些特點,這么優秀的框架我們當然要學習。
# 2. 什么是Glide?

Glide是Google推出的優秀的用來實現圖片異步加載的框架。
# 3. 下載Glide
~~~
dependencies {
implementation 'com.github.bumptech.glide:glide:4.9.0'
}
~~~
# 4. 設置
## 1. 網絡權限
如果你計劃從 URL 或一個網絡連接中加載數據,你需要添加`INTERNET`和`ACCESS_NETWORK_STATE`權限到你的`AndroidManifest.xml`中:
~~~
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="your.package.name"
<uses-permission android:name="android.permission.INTERNET"/>
<!--
Allows Glide to monitor connectivity status and restart failed requests if users go from a
a disconnected to a connected network state.
-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application>
...
</application>
</manifest>
~~~
從技術上講,`ACCESS_NETWORK_STATE`對于 Glide 加載 URL 并不是必需的,但是它將幫助 Glide 處理*片狀網絡(flaky network)*和飛行模式。請繼續閱讀下面的連接監視章節以了解詳情。
**連接監聽**
如果你正在從 URL 加載圖片,Glide 可以自動幫助你處理片狀網絡連接:它可以監聽用戶的連接狀態并在用戶重新連接到網絡時重啟之前失敗的請求。如果 Glide 檢測到你的應用擁有`ACCESS_NETWORK_STATE`權限,Glide 將自動監聽連接狀態而不需要額外的改動。
你可以通過檢查`ConnectivityMonitor`日志標簽來驗證 Glide 是否正在監聽網絡狀態:
~~~
adb shell setprop log.tag.ConnectivityMonitor DEBUG
~~~
如果你成功添加了`ACCESS_NETWORK_STATE`權限,你將在 logcat 中看到類似這樣的日志:
~~~
11-18 18:51:23.673 D/ConnectivityMonitor(16236): ACCESS_NETWORK_STATE permission granted, registering connectivity monitor
11-18 18:48:55.135 V/ConnectivityMonitor(15773): connectivity changed: false
11-18 18:49:00.701 V/ConnectivityMonitor(15773): connectivity changed: true
~~~
而如果權限缺失,你將看到一條錯誤:
~~~
11-18 18:51:23.673 D/ConnectivityMonitor(16236): ACCESS_NETWORK_STATE permission missing, cannot register connectivity monitor
~~~
## 2. 本地存儲(Local Storage)
要從本地文件夾或 DCIM 或圖庫中加載圖片,你將需要添加`READ_EXTERNAL_STORAGE`權限:
~~~
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="your.package.name"
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application>
...
</application>
</manifest>
~~~
而如果要使用[`ExternalPreferredCacheDiskCacheFactory`](https://muyangmin.github.io/glide-docs-cn/javadocs/431/com/bumptech/glide/load/engine/cache/ExternalPreferredCacheDiskCacheFactory.html)來將 Glide 的緩存存儲到公有 SD 卡上,你還需要添加`WRITE_EXTERNAL_STORAGE`權限:
~~~
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="your.package.name"
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application>
...
</application>
</manifest>
~~~
# 5. 使用Glide加載網絡圖片
**基本用法**
多數情況下,使用Glide加載圖片非常簡單,一行代碼足矣:
~~~
Glide.with(fragment)
.load(myUrl)
.into(imageView);
~~~
取消加載同樣很簡單:
~~~
Glide.with(fragment).clear(imageView);
~~~
盡管及時取消不必要的加載是很好的實踐,但這并不是必須的操作。實際上,當[`Glide.with()`](https://muyangmin.github.io/glide-docs-cn/javadocs/400/com/bumptech/glide/Glide.html#with-android.app.Fragment-)中傳入的 Activity 或 Fragment 實例銷毀時,Glide 會自動取消加載并回收資源。
# 6. Generated API
1. 添加 Glide 注解處理器的依賴:
~~~
dependencies {
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
}
~~~
參閱[下載和設置](https://muyangmin.github.io/glide-docs-cn/doc/download-setup.html)頁面了解更多。
2. 在 Application 模塊中包含一個[`AppGlideModule`](https://muyangmin.github.io/glide-docs-cn/javadocs/400/com/bumptech/glide/module/AppGlideModule.html)的實現:
~~~
package com.example.myapp;
import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.module.AppGlideModule;
@GlideModule
public final class MyAppGlideModule extends AppGlideModule {}
~~~
你不必去重寫`AppGlideModule`中的任何一個方法。子類中完全可以不用寫任何東西,它只需要繼承`AppGlideModule`并且添加`@GlideModule`注解。
[`AppGlideModule`](https://muyangmin.github.io/glide-docs-cn/javadocs/400/com/bumptech/glide/module/AppGlideModule.html)的實現必須使用[`@GlideModule`](https://muyangmin.github.io/glide-docs-cn/javadocs/400/com/bumptech/glide/annotation/GlideModule.html)注解標記。如果注解不存在,該 module 將不會被 Glide 發現,并且在日志中收到一條帶有`Glide`tag 的警告,表示 module 未找到。
- 班規
- 第一單元 Git
- 1.1 Git簡介
- 1.2 Git安裝
- 1.3 版本控制
- 1.4 遠程倉庫
- 1.5 分支管理
- 1.6 Git命令總結
- 1.7 在Android Studio中使用Git
- 第一單元 作業
- 第二單元 項目立項
- 2.1 需求文檔
- 2.2 原型圖
- 2.3 接口文檔
- 2.4 項目實現
- 2.5 制定開發計劃
- 第二單元 作業
- 第三單元 MVP搭建項目框架
- 3.1 代碼架構模式
- 3.2 普通方式寫代碼
- 3.3 使用MVC重構代碼
- 3.4 使用MVP重構代碼
- 3.5 使用接口提高代碼通用性
- 3.6 內存泄漏
- 3.7 使用契約統一管理接口
- 第三單元 作業
- 第四單元 MVP架構優化
- 4.1 MVP基類封裝與泛型應用
- 4.3 BaseActivity的封裝
- 第五單元 Volley網絡框架
- 5.1 Volley網絡框架
- 第六單元 Glide實現圖片異步加載
- 6.1 開始使用
- 6.2 占位符
- 6.3 Glide緩存
- 6.4 GlideGifVideo與色彩模式
- 第七單元 傳統屏幕適配
- 7.1 相對布局
- 7.1 權重
- 7.3 .9Patch
- 7.4 dimens適配
- 7.5 國際化
- 7.6 shape實現自定義樣式
- 7.7 自定義樣式
- 7.8 沉浸式狀態欄
- 第八單元 RecyclerView
- 8.1 RecycleView
- 第九單元 自定義View
- 第十單元 自定義View實戰
- 第十一單元 自定義View進階
- 第二十單元 屬性動畫
- 第十三單元 異常捕獲機制
- 第十四單元 原生登錄、注冊模塊
- 第十五單元 第三方登錄、分享、統計
- 第十六單元 HTML5新特性
- 第十七單元 CSS3新特性
- 第十八單元 WebView與JS交互
- 第一周周考
- 第二周周考
- 第三周周考
- 月考