### 加載大圖
#### 一種情況
1. 對于圖片顯示:根據需要顯示圖片控件的大小對圖片進行壓縮顯示。
2. 果圖片數量非常多:則會使用LruCache等緩存機制,將所有圖片占據的內容維持在一個范圍內
#### 另一種情況
單個圖片非常巨大,并且還不允許壓縮
首先不壓縮,按照原圖尺寸加載,那么屏幕肯定是不夠大的,并且考慮到內存的情況,不可能一次性整圖加載到內存中,所以肯定是局部加載,那么就需要用到一個類:
BitmapRegionDecoder
其次,既然屏幕顯示不完,那么最起碼要添加一個上下左右拖動的手勢,讓用戶可以拖動查看。
去自定義一個顯示巨圖的View,支持用戶去拖動查看
Glide 和 Picasso 可以說是目前 Android 上最流行的圖片加載庫了。大部分安卓應用開發人員都有使用過這兩個庫在他們的開發工作中。這兩個庫也都確實提供了大量圖片加載的功能,而且也都經過了很多應用的檢驗,是可靠可信的。表面看上去似乎兩者工作原理很相似,但是實際上是有著很大差別的,主要體現在下面幾個方面:
1. 下載圖片的方式
2. 圖片的緩存機制
3. 加載到內存的機制
### 緩存大小
兩個庫也都支持緩存圖片,都通過下載圖片后,緩存到本地。但是這里對于緩存本地的機制,兩個庫是完全不同的做法。
**Picasso** 是下載圖片然后緩存完整的大小到本地,比如說圖片的大小是1080p的,之后如果我需要同一張圖片,就會返回這張 full size 的,如果我需要resize,也是對這種 full size 的做 resize。
**Glide** 則是完全不一樣的做法。Glide 是會先下載圖片,然后改變圖片的大小,以適應 imageView 的要求,然后緩存到本地。 所以如果你是下載同一張圖片,但是設定兩個不一樣大小的 imageView, 那么Glide 實際上是會緩存兩份。
換個角度來看,這里不僅僅是緩存的問題,比如一個 ImageView 要改變它的大小,PIcasso 就只需要下載一次 full size 的圖片,但是 Glide 實際上就不僅僅是下載一次了,它需要去單獨下載然后改變大小適配 imageView,因為對于 Glide 來講,需要緩存不同大小的同一張圖片。
### 內存的使用
Glide 默認是用的 RGB_555 的設定,PIcasso 則是用的 ARGB _8888的設定。
### 加載圖片的時間
當嘗試加載一個圖片的時候,兩個庫都會采用先從緩存中讀取,如果緩存中沒有,再去下載的做法。
實際試驗中,Picasso 會比 Glide 快一點。猜測可能的原因還是因為之前講到的緩存機制導致,因為Picasso 是直接把圖加載到內存中,而 Glide 則需要改變圖片大小再加載到內存中去。這個應該是會耗費一定的時間。
但是,當加載圖片從內存中的時候,Glide 則比 Picasso 要快。其原理還是因為緩存機制的區別。因為Picasso 從緩存中拿到的圖片,還要先去 resize 后,然后設定給 imageView,但是 Glide 則不需要這樣。
### 其他功能的對比
1. GIF 支持:Glide 支持 GIF。 對于加載 GIF 來說,Glide 只需要簡單使用 Glide.with(...).load(...)。 但是 Picasso 是不支持的,因此如果你的應用中是需要加載 GIF 的話,那就只能用 Glide 了。
2. 靈活性:Glide 提供了非常多的配置,你可以非常靈活的根據你的需求來客制化,從而縮減 Glide 庫的大小等。
## Glide和Picasso他們的對比的優缺點
#### 1.Picasso和Glide的withi后面的參數不同
Picasso.with(這里只能傳入上下文) .
Glide.with,后面可以傳入上下文,activity實例,FragmentActivity實例,Fragement.傳入的對象要比前者多.
#### 2.加載后圖片質量不同
Picasso采用的ARGB-8888,Glide采用的是RGB-565
相對而言,Picasso加載的是全圖,圖片質量和清晰對要比Glide的要高,但是,因為加載的采樣率過高,導致,出現OOM異常的概率要比Glide要大很多.
#### 3.加載Gif圖片(備注:Gif圖片消耗太對內存,盡量謹慎使用):
Picasso不能加載git圖片
Glide可以加載緩存圖片
#### 4.緩存策略和加載速度.
Picasso緩存的是全尺寸,而 Glide的緩存的更ImageView的尺寸相同.
講ImageView調整為不同的大小,不管大小如何設置,Picasso只緩存一個全尺寸的,Glide則不同,他會為每種大小不一致的ImageView都緩存一次.
Glide的這個特點,讓加載顯得特別的快,而Picasso則因為需要在顯示之前重新調整大小而導致一些延遲,(即便是添加了noFade)
#### 5.總結:
Glide比Picasso加載速度要快,其實他是在Picasso的基礎上進行了第二次封裝,但是Glide比Picasso需要更多的空間來緩存;Glide加載圖像以及磁盤緩存的方式,都優于Picasso,且Glide更有利于減少OutOfMemoryError的發生;
Gif動畫,是Glide的殺手锏.
- 空白目錄
- 自我介紹
- Android面試題
- Handler
- 網絡請求框架
- 圖片處理框架Picasso,Glide
- Android最佳性能實踐OOM
- 異步:RxJava,AsyncTask
- View,ViewGroup事件分發
- 消息傳遞:EventBus
- HTTPS和HTTP的區別
- 進程間通信的方式
- HttpClient與HttpUrlConnection的區別
- 性能優化
- Java多線程
- Fragment狀態保持和恢復
- 講解一下Context
- JNI
- java虛擬機和Dalvik虛擬機的區別
- 線程sleep和wait有什么區別
- 保存Activity狀態
- WebView與js交互(調用哪些API)
- 內存泄露檢測,內存性能優化
- 布局優化
- 自定義view和動畫
- 設計模式(單例,工廠,觀察者。作用,使用場景)
- String,Stringbuffer,Stringbuilder 區別
- 開源框架,為什么使用,與別的有什么區別
- Android大廠面試題
- 愛奇藝
- 小米
- 騰訊
- 阿里
- 今日頭條
- 共同問到的
- 其他問題
- 框架MVC、MVP、MVVM
- sleep和wait有什么區別
- React Native原理
- React Native面試題
- 數據結構
- Android開發
- 基礎知識
- Java基礎
- 數據結構
- 面向對象思想
- 設計模式
- 開發環境
- Android SDK
- Activity
- Service
- Broadcastreceiver
- Contentprovider
- ActionBar
- Fragment
- UI
- 通信
- 數據持久化
- 性能
- 調試
- 適配
- 測試
- 安全
- NDK
- 手機功能
- 第三方擴展
- 其他
- 2018 Java面試題
- Android(2017-2018)BAT面試題整理
- 2017下半年,一二線互聯網公司Android面試題匯總
- 2018阿里Android面試題
- 一面
- 二面
- 三面