日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Picasso-源码解析(二)

發布時間:2024/4/14 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Picasso-源码解析(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

####前言 前面一篇文章簡單的介紹了Picasso的使用,已經整個源碼調用的流程,過了一遍。但是其中還有很多的細節我們并沒有去涉及到。今天在昨天的基礎之上再進行深入。

Picasso對象

前面一篇文章我們是從Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(ivTest)慢慢深入的,這里我們也要找個可以深入的對象,就是最重要的Picasso對象。

因為我們在使用的時候就是直接Picasso.get().***這樣去調用的,所以說我們先了解下Picasso所有的api,對整個框架的理解,以及對Picasso更有效率的使用。

####public方法

我們的as很強大,直接左側欄查看當前類的公用方法.

這里就把方法一個個介紹下。便于大家理解。

  • areIndicatorsEnabled(),setIndicatorsEnabled()
  • @SuppressWarnings("UnusedDeclaration") public void setIndicatorsEnabled(boolean enabled) {indicatorsEnabled = enabled;}@SuppressWarnings("UnusedDeclaration") public boolean areIndicatorsEnabled() {return indicatorsEnabled;} 復制代碼

    用來設置和獲取是否顯示當前加載圖片的方式,上一篇文章有使用過,就是顯示當前圖片是由三級緩存中的哪一個加載的。

  • cancelRequest 看名字就知道,是直接用來取消請求的。 這里可以深入下。
  • public void cancelRequest(@NonNull ImageView view) {if (view == null) {throw new IllegalArgumentException("view cannot be null.");}cancelExistingRequest(view);} void cancelExistingRequest(Object target) {checkMain();//前面在加載圖片的時候是會target-action以key-value的方式保存在targetToAction中,后面我會指出,在哪里保存的。這里直接通過target獲取到action,然后cancelAction action = targetToAction.remove(target);if (action != null) {action.cancel();dispatcher.dispatchCancel(action);}//這里就比較有意思,因為第一篇文章我們介紹過,如果是`ImageView`的話,很可能會使用fit方法去適配`ImageView`的寬高,就有使用到DeferredRequestCreator,所以這里要移除if (target instanceof ImageView) {ImageView targetImageView = (ImageView) target;DeferredRequestCreator deferredRequestCreator =targetToDeferredRequestCreator.remove(targetImageView);if (deferredRequestCreator != null) {deferredRequestCreator.cancel();}}}復制代碼
  • cancelTag,pauseTag,resumeTag 這3個一起說,這3個可以說是批量操作符??梢院唵蔚目匆幌隆?/li>Picasso.get().load("http://i.imgur.com/DvpvklR.png").tag("test").into(ivTest)Picasso.get().load("http://i.imgur.com/DvpvklR.png").tag("test").into(ivTest2)Picasso.get().cancelTag("test") 復制代碼

    可以先tag標記下每個請求,然后可以批量處理。 分別是取消,暫停,恢復。

  • setLoggingEnabled,isLoggingEnabled
  • public void setLoggingEnabled(boolean enabled) {loggingEnabled = enabled;}public boolean isLoggingEnabled() {return loggingEnabled;} 復制代碼

    是否啟動日志

  • getSnapshot
  • @SuppressWarnings("UnusedDeclaration") public StatsSnapshot getSnapshot() {return stats.createSnapshot();} 復制代碼

    獲取到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的使用狀態

  • invalidate 因為Picasso使用了LruCache緩存到內存中,key-value與url-bitmap對應起來(實際上不是保存Bitmap,而是自己封裝了另外一個類,但是里面是有Bitmap的,這里先不具體)。invalidate可以移除緩存。
  • public void invalidate(@Nullable Uri uri) {if (uri != null) {cache.clearKeyUri(uri.toString());}} 復制代碼
  • load 這個就不說了,上一篇文章介紹了很多了。
  • 重要對象介紹

    上面簡單的了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先不說了。

    我們來先來簡單介紹下另外幾個。

  • Downloader downloader 默認實現OkHttp3Downloader @NonNull @Override public Response load(@NonNull Request request) throws IOException { return client.newCall(request).execute(); 復制代碼
  • } 其實是可以自己復寫,使用自己的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所能使用的內存值獲取一個比較合適的緩存內存的最大值。自己可以復寫調整。

  • Listener listener 沒有默認值
  • public interface Listener {void onImageLoadFailed(Picasso picasso, Uri uri, Exception exception); } 復制代碼

    很顯然是用來全局監聽圖片加載失敗的事件。 5. RequestTransformer transformer 默認

    RequestTransformer IDENTITY = new RequestTransformer() {@Override 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-源码解析(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。