Glide使用生命周期對圖片進(jìn)行管理,根據(jù)Glide的使用方法我們可以看出祠挫,傳入的context建議傳入Activity或Fragment滤祖,因?yàn)閭魅脒@兩者可以根據(jù)Activity或Fragment的生命周期對圖片進(jìn)行管理涛菠,比如在Paused狀態(tài)暫停加載塑荒,在Resumed的時(shí)候又自動重新加載倚舀。所以我建議傳參的時(shí)候傳遞Activity 和 Fragment給Glide枪向,而不是Context。
Glide.with(context)
.load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg")
.into(ivImg);
那么Glide是如何利用傳入的Frgament或Activity對生命周期進(jìn)行管理呢?
先一步一步看吧俗或,當(dāng)你調(diào)用Glide.with()方法的時(shí)候市怎,傳入了Activity或者Fragment對象,然后根據(jù)它獲取到FragmentManager辛慰,然后再根據(jù)這個(gè)FragmentManager會去生成一個(gè)RequestManagerFragment区匠,RequestManagerFragment就是Glide管理圖片生命周期的法寶,F(xiàn)ragment里面有onStart() onStop() 和onDestroy()的生命周期方法帅腌。在這個(gè)再去回調(diào)RequestManager里面的方法驰弄,就起到了,自動控制圖片加載還是暫停的目的速客。
舉個(gè)例子戚篙,如果Glide.with()傳入的是Activity,那么當(dāng)Activity執(zhí)行到onStop()生命周期(比如跳轉(zhuǎn)到其他頁面去了)的時(shí)候溺职,應(yīng)該是不需要加載圖片了岔擂。就會影響到該Activity旗下的Fragment也就是RequestManagerFragment,回調(diào)它的onStop()浪耘,它又會回調(diào)RequestManager的onStop()方法乱灵,接著就把沒有加載完成的圖片給暫停掉了。
1.Glide默認(rèn)加載Bitmap的時(shí)候會使用RGB_565格式七冲,而Picasso會默認(rèn)使用ARGB8888格式阔蛉,這樣的話,Glide比Picasso的內(nèi)存開銷要小一半癞埠,但是清晰度會低于Picasso状原,不過可以設(shè)置一個(gè)GlideMoudle將加載出來的RGB_565格式轉(zhuǎn)為ARGB8888格式,這樣雖然會增加Glide消耗的內(nèi)存(大概兩倍),不過仍然還是遠(yuǎn)低于Picasso消耗的內(nèi)存的苗踪。
2.加載圖片的時(shí)候颠区,Picasso默認(rèn)會加載全尺寸的圖片,而Glide會根據(jù)需要填充的View的大小來決定需要加載圖片的尺寸通铲,因此消耗的內(nèi)存更少毕莱。不過Picasso也可以指定加載圖片的尺寸,不過需要多一步計(jì)算颅夺,當(dāng)計(jì)算完成后兩者消耗內(nèi)存接近朋截,不過相比之下還是Glide效率更高,因?yàn)樗鼤詣佑?jì)算出任意情況下的ImageView的尺寸吧黄。
3.磁盤緩存方面: Picasso會緩存全尺寸的圖片(只緩存一次部服,在需要的時(shí)候會取出然后調(diào)整大小再填充所以會比Glide慢),而Glide緩存的是跟ImageView尺寸相同的拗慨,而且加載的是RGB_565格式廓八,緩存的就是該格式奉芦,不過Glide的緩存,不同尺寸會分別緩存一次剧蹂,這樣的話各個(gè)尺寸都會存在緩存声功,可以通過下面代碼修改緩存方式:
Glide.with(this)
.load("http://nuuneoi.com/uploads/source/playstore/cover.jpg")
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(ivImgGlide);
下次在任何ImageView中加載圖片的時(shí)候,全尺寸的圖片將從緩存中取出宠叼,重新調(diào)整大小先巴,然后緩存。
Glide的這種方式優(yōu)點(diǎn)是加載顯示非趁岸快筹裕。而Picasso的方式則因?yàn)樾枰陲@示之前重新調(diào)整大小而導(dǎo)致一些延遲,即使使用Picasso.noFade()讓其立即顯示窄驹。
4.Glide可以加載Gif圖朝卒,而Picasso卻不行,但是Glide加載Gif圖的時(shí)候會消耗大量的內(nèi)存乐埠,除了gif動畫之外抗斤,Glide還可以將任何的本地視頻解碼成一張靜態(tài)圖片。
5.此外丈咐,Glide還可以配置圖片顯示的動畫瑞眼,而Picasso只有一種動畫:fading in。
6.Glide和Picasso都是非常完美的庫棵逊。Glide加載圖像以及磁盤緩存的方式都要優(yōu)于Picasso伤疙,速度更快米奸,并且Glide更有利于減少OutOfMemoryError的發(fā)生肯骇,GIF動畫是Glide的殺手锏。不過Picasso的圖片質(zhì)量更高笨枯,建議是使用Glide蛙讥,但是將Bitmap格式換成 ARGB_8888锯蛀、讓Glide緩存同時(shí)緩存全尺寸和改變尺寸兩種。