Picasso框架原始碼解析(一)。

2021-07-05 04:05:42 字數 3806 閱讀 7196

相信做android開發的都會用到picasso、universal-imageloader等,和相關的框架。這些開源的框架在很多情況下都可以使用,這個時候可能就有問題了,我該怎麼選擇框架呢? 本人曾經或者現在也會遇到這樣的苦惱,(有時候就像剛學android一樣,當時的苦惱是如何實現這個功能)現在是用什麼方式實現來說「價效比最好」。

對於這個問題,只有唯一解。那就是對這幾個框架的原始碼進行專研了。理解了其中的原理和邏輯,那麼這些問題就不在是為什麼了。
先說說我在專案中關於常用到的兩個框架picasso和uil(universal-imageloader)

先分析原始碼,之後在總結他們的適用場景。簡介

這是picasso官網對其的說明,我的總結是 簡單、粗暴,一行**。

picasso.with(context).load("").into(imageview);
picasso的特點

看到這裡相信你對picasso有了一些印象了吧,接下來分析原始碼

picasso的使用

resources, assets, files, content providers are all supported as image sources.

一般我們的image可以是resources, assets, files, content providers

picasso.with(context).load(r.drawable

.landing_screen).into(imageview1);

picasso.with(context).load("file:///android_asset/dvpvklr.png").into(imageview2);

picasso.with(context).load(new file(...)).into(imageview3);

picasso_iv = (imageview) findviewbyid(r.id.picasso_iv);

picasso.with(this).load("").transform(new transformation()

return result;

}@override

public string key()

}).placeholder(r.mipmap.ic_launcher).into(picasso_iv);

我們看到 picasso.with(this),那麼picasso是如我們所料的單例模式嗎?
public

class

picasso }}

return singleton;

}}...

volatile關鍵字

接下來看picasso.builder(context)).build()

public picasso build() 

}

接著看

picasso.with(this).load(""),拿到picasso物件後進行load()操作

public requestcreator load(uri uri) 

public requestcreator load(string path) else

if(path.trim().length() == 0) else

}public requestcreator load(file file)

public requestcreator load(int resourceid) else

}

//獲取乙個requestcreator物件

requestcreator(picasso picasso, uri uri, int resourceid) else

}

接著看,拿到requestcreator我們在呼叫into()

public

void

into(imageview target)

//////

////

public

void

into(imageview target, callback callback)

if(callback != null)

return;}}

//沒快取

imageviewaction action1 = new imageviewaction(this.picasso, target, request1, this.memorypolicy, this.networkpolicy, this.errorresid, this.errordrawable, requestkey1, this.tag, callback, this.nofade);

//前面所做的工作就是為了建立乙個imageviewaction物件

this.picasso.enqueueandsubmit(action1);

}}

接著看this.picasso.enqueueandsubmit(action1);

void enqueueandsubmit(action action) 

this.submit(action);

}void submit(action action)

///跟蹤到這裡,是不是有點欣慰啊。。哈哈,在建構函式裡面已經對handler有賦值

void dispatchsubmit(action action)

///如下dispatcher

dispatcher(context context, executorservice service, handler mainthreadhandler, ********** **********, cache cache, stats stats)

接著往下走,拿到了hanlder之後 msg.what=1; 繼續跟蹤**

private

static

class

dispatcherhandler

extends

handler

public

void

handlemessage(final message msg)

}}

繼續go~~!!!!!

void performsubmit(action action, boolean dismissfailed) 

} else else if(this.service

.isshutdown())

} else

if(action.getpicasso().loggingenabled) }}

}//上面函式中最主要的 bitmaphunter 其實就是乙個runnable 負責網路載入

hunter = bitmaphunter.forrequest(action.getpicasso(), this, this.cache, this.stats, action);

///

雖然我們在用picasso的時候十分簡單,就一行**。但是原始碼的實現的過程,做為一名開發者還是十分有必要的仔細閱讀的。

微服務框架原始碼解析

springboot 自動配置主要通過 enableautoconfiguration,conditional,enableconfigurationproperties 或者 configurationproperties 等幾個註解來進行自動配置完成的。enableautoconfigurati...

原始碼解析java集合框架,ArrayList原始碼

arraylist是list介面下的乙個實現類,arraylist是乙個動態陣列,底層資料結構為可以動態增長的陣列,相比陣列來說,arraylist可以動態的增加刪除元素,有成熟的擴容演算法。如圖,為arraylist資料結構,是乙個記憶體連續且緊湊的陣列。arraylist訪問元素時間複雜度為o ...

TFS原始碼解析一

tfs是乙個 分布式檔案系統,集群中主要涉及名字伺服器nameserver,以及資料伺服器dataserver,nameserver提供索引管理,dataserver提供資料儲存及管理。客戶端通過nameserver請求,獲取到dataserver中的資料路徑,然後通過dataserver獲取資料操...