Picasso-源码解析(二)
####前言 前面一篇文章簡單的介紹了Picasso的使用,已經(jīng)整個源碼調(diào)用的流程,過了一遍。但是其中還有很多的細(xì)節(jié)我們并沒有去涉及到。今天在昨天的基礎(chǔ)之上再進(jìn)行深入。
Picasso對象
前面一篇文章我們是從Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(ivTest)慢慢深入的,這里我們也要找個可以深入的對象,就是最重要的Picasso對象。
因為我們在使用的時候就是直接Picasso.get().***這樣去調(diào)用的,所以說我們先了解下Picasso所有的api,對整個框架的理解,以及對Picasso更有效率的使用。
####public方法
我們的as很強大,直接左側(cè)欄查看當(dāng)前類的公用方法.
這里就把方法一個個介紹下。便于大家理解。
用來設(shè)置和獲取是否顯示當(dāng)前加載圖片的方式,上一篇文章有使用過,就是顯示當(dāng)前圖片是由三級緩存中的哪一個加載的。
可以先tag標(biāo)記下每個請求,然后可以批量處理。 分別是取消,暫停,恢復(fù)。
是否啟動日志
獲取到Picasso的一個快照。
Picasso.get().snapshot.dump() 復(fù)制代碼然后直接打印。
===============BEGIN PICASSO STATS ===============Memory Cache StatsMax Cache Size: 57521883Cache Size: 0Cache % Full: 0Cache Hits: 0Cache Misses: 0Network StatsDownload Count: 0Total Download Size: 0Average Download Size: 0Bitmap StatsTotal Bitmaps Decoded: 0Total Bitmap Size: 0Total Transformed Bitmaps: 0Total Transformed Bitmap Size: 0Average Bitmap Size: 0Average Transformed Bitmap Size: 0 ===============END PICASSO STATS =============== 復(fù)制代碼這個就灰常的方便了,直接看當(dāng)前Picasso的使用狀態(tài)
重要對象介紹
上面簡單的了Picasso對象,但是還有很多重要的對象。 我們可以從Picasso.Builder中去尋找,因為這里面都是我們可以配置的對象。
public static class Builder {private final Context context;private Downloader downloader;private ExecutorService service;private Cache cache;private Listener listener;private RequestTransformer transformer;private List<RequestHandler> requestHandlers;private Bitmap.Config defaultBitmapConfig;private boolean indicatorsEnabled;private boolean loggingEnabled; ... 復(fù)制代碼這么多可以配置的對象,ndicatorsEnabled,loggingEnabled,context先不說了。
我們來先來簡單介紹下另外幾個。
} 其實是可以自己復(fù)寫,使用自己的http框架 2. ExecutorService service 默認(rèn)實現(xiàn)`PicassoExecutorService`java
//創(chuàng)建了一個線程池,默認(rèn)都是3個核心線程,然后還有一個有優(yōu)先級的阻塞隊列PicassoExecutorService() { super(DEFAULT_THREAD_COUNT, DEFAULT_THREAD_COUNT, 0, TimeUnit.MILLISECONDS,new PriorityBlockingQueue<Runnable>(), new Utils.PicassoThreadFactory()); 復(fù)制代碼} ``` 這里其實還有一個比較有意思的方法
void adjustThreadCount(NetworkInfo info) {if (info == null || !info.isConnectedOrConnecting()) {setThreadCount(DEFAULT_THREAD_COUNT);return;}switch (info.getType()) {case ConnectivityManager.TYPE_WIFI:case ConnectivityManager.TYPE_WIMAX:case ConnectivityManager.TYPE_ETHERNET:setThreadCount(4);break;case ConnectivityManager.TYPE_MOBILE:switch (info.getSubtype()) {case TelephonyManager.NETWORK_TYPE_LTE: // 4Gcase TelephonyManager.NETWORK_TYPE_HSPAP:case TelephonyManager.NETWORK_TYPE_EHRPD:setThreadCount(3);break;case TelephonyManager.NETWORK_TYPE_UMTS: // 3Gcase TelephonyManager.NETWORK_TYPE_CDMA:case TelephonyManager.NETWORK_TYPE_EVDO_0:case TelephonyManager.NETWORK_TYPE_EVDO_A:case TelephonyManager.NETWORK_TYPE_EVDO_B:setThreadCount(2);break;case TelephonyManager.NETWORK_TYPE_GPRS: // 2Gcase TelephonyManager.NETWORK_TYPE_EDGE:setThreadCount(1);break;default:setThreadCount(DEFAULT_THREAD_COUNT);}break;default:setThreadCount(DEFAULT_THREAD_COUNT);}} 復(fù)制代碼就是會根據(jù)網(wǎng)絡(luò)的情況使用不同的線程數(shù)。可以學(xué)習(xí)下。 也可以自定義 3. Cache cache 默認(rèn)使用LruCache
public LruCache(@NonNull Context context) {this(Utils.calculateMemoryCacheSize(context));}... static int calculateMemoryCacheSize(Context context) {ActivityManager am = getService(context, ACTIVITY_SERVICE);boolean largeHeap = (context.getApplicationInfo().flags & FLAG_LARGE_HEAP) != 0;int memoryClass = largeHeap ? am.getLargeMemoryClass() : am.getMemoryClass();// Target ~15% of the available heap.return (int) (1024L * 1024L * memoryClass / 7);}復(fù)制代碼這里也很有意思,根據(jù)當(dāng)前的app所能使用的內(nèi)存值獲取一個比較合適的緩存內(nèi)存的最大值。自己可以復(fù)寫調(diào)整。
很顯然是用來全局監(jiān)聽圖片加載失敗的事件。 5. RequestTransformer transformer 默認(rèn)
RequestTransformer IDENTITY = new RequestTransformer() { public Request transformRequest(Request request) {return request;}}; 復(fù)制代碼其實就是一個request的全局的一個轉(zhuǎn)化。默認(rèn)不轉(zhuǎn)化。 6. List requestHandlers 前面已經(jīng)介紹過了默認(rèn)有很多種requestHandlers,也可以自己定義 7. Bitmap.Config defaultBitmapConfig 默認(rèn)為null 在requestHandler里面的createBitmapOptions有使用到
static BitmapFactory.Options createBitmapOptions(Request data) {final boolean justBounds = data.hasSize();final boolean hasConfig = data.config != null;BitmapFactory.Options options = null;if (justBounds || hasConfig || data.purgeable) {options = new BitmapFactory.Options();options.inJustDecodeBounds = justBounds;options.inInputShareable = data.purgeable;options.inPurgeable = data.purgeable;//在這里,如果有config,就配置下,如果沒有那么就默認(rèn)if (hasConfig) {options.inPreferredConfig = data.config;}}return options;} 復(fù)制代碼一共這么多選項,可以選擇。
總結(jié)
Picasso用起來也挺爽的,后面有空學(xué)習(xí)下Glide和Fresco做下對比
總結(jié)
以上是生活随笔為你收集整理的Picasso-源码解析(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 记账本开发进程第四天
- 下一篇: Activiti 7.1.4 发布,业务