Picasso-源码解析(二)
####前言 前面一篇文章簡單的介紹了Picasso的使用,已經整個源碼調用的流程,過了一遍。但是其中還有很多的細節我們并沒有去涉及到。今天在昨天的基礎之上再進行深入。
Picasso對象
前面一篇文章我們是從Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(ivTest)慢慢深入的,這里我們也要找個可以深入的對象,就是最重要的Picasso對象。
因為我們在使用的時候就是直接Picasso.get().***這樣去調用的,所以說我們先了解下Picasso所有的api,對整個框架的理解,以及對Picasso更有效率的使用。
####public方法
我們的as很強大,直接左側欄查看當前類的公用方法.
這里就把方法一個個介紹下。便于大家理解。
用來設置和獲取是否顯示當前加載圖片的方式,上一篇文章有使用過,就是顯示當前圖片是由三級緩存中的哪一個加載的。
可以先tag標記下每個請求,然后可以批量處理。 分別是取消,暫停,恢復。
是否啟動日志
獲取到Picasso的一個快照。
Picasso.get().snapshot.dump() 復制代碼然后直接打印。
===============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 =============== 復制代碼這個就灰常的方便了,直接看當前Picasso的使用狀態
重要對象介紹
上面簡單的了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; ... 復制代碼這么多可以配置的對象,ndicatorsEnabled,loggingEnabled,context先不說了。
我們來先來簡單介紹下另外幾個。
} 其實是可以自己復寫,使用自己的http框架 2. ExecutorService service 默認實現`PicassoExecutorService`java
//創建了一個線程池,默認都是3個核心線程,然后還有一個有優先級的阻塞隊列PicassoExecutorService() { super(DEFAULT_THREAD_COUNT, DEFAULT_THREAD_COUNT, 0, TimeUnit.MILLISECONDS,new PriorityBlockingQueue<Runnable>(), new Utils.PicassoThreadFactory()); 復制代碼} ``` 這里其實還有一個比較有意思的方法
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);}} 復制代碼就是會根據網絡的情況使用不同的線程數。可以學習下。 也可以自定義 3. Cache cache 默認使用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);}復制代碼這里也很有意思,根據當前的app所能使用的內存值獲取一個比較合適的緩存內存的最大值。自己可以復寫調整。
很顯然是用來全局監聽圖片加載失敗的事件。 5. RequestTransformer transformer 默認
RequestTransformer IDENTITY = new RequestTransformer() { public Request transformRequest(Request request) {return request;}}; 復制代碼其實就是一個request的全局的一個轉化。默認不轉化。 6. List requestHandlers 前面已經介紹過了默認有很多種requestHandlers,也可以自己定義 7. Bitmap.Config defaultBitmapConfig 默認為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,就配置下,如果沒有那么就默認if (hasConfig) {options.inPreferredConfig = data.config;}}return options;} 復制代碼一共這么多選項,可以選擇。
總結
Picasso用起來也挺爽的,后面有空學習下Glide和Fresco做下對比
總結
以上是生活随笔為你收集整理的Picasso-源码解析(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 记账本开发进程第四天
- 下一篇: spring顾问包装通知