相信做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獲取資料操...