ButterKnife基本使用 http://www.cnblogs.com/mengdd/archive/2015/06/23/4595973.html
創(chuàng)新互聯(lián)公司長期為成百上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為武寧企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè),武寧網(wǎng)站改版等技術(shù)服務(wù)。擁有10余年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
Android SlidingMenu 使用詳解
http://blog.csdn.net/lmj623565791/article/details/36677279
ImageLoader的源碼分析:
這個庫封裝的層次實在是太多了?。?!可以借鑒作者是怎么封裝類的?。?!
DisplayImageOptions Builder 配置一些參數(shù)
ImageLoaderEngine 引擎類
ProcessAndDisplayImageTask
ImageLoadingInfo 存儲一些下載相關(guān)的信息
。。。
從ImageLoader.getInstance().displayImage這個方法追溯,這個方法可以選傳url,p_w_picpath,也可以傳
入?yún)?shù)和進(jìn)度監(jiān)聽者。
1)ImageLoader的實例化采用單例設(shè)計模式
2)ImageLoader的初始化init方法會初始化引擎ImageLoaderEngine,并傳入DisplayImageOptions參數(shù)
》ImageLoaderEngine封裝了一些線程池的操作
》這個類里還用到FlushedInputStream這個類,F(xiàn)lushedInputStream會避免個別的錯誤Issue 6066: BitmapFactory.decodeStream() fails if InputStream.skip() does not skip fully
》類中用同步Map來存儲ImageView的緩存key值。
》submit會將任務(wù)提交到線程池
3)判斷uri為不為null,為null會將參數(shù)DisplayImageOptions中的默認(rèn)圖片設(shè)置給ImageView。
同時會回調(diào)監(jiān)聽者的一些方法
從參數(shù)DisplayImageOptions中得到最大的圖片尺寸
根據(jù)url和圖片的最大尺寸來生成緩存的key
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
大致的思路:
》在Application里init
初始化參數(shù)DisplayImageOptions并傳遞給ImageLoaderEngine類。
ImageLoaderEngine主要是維護(hù)了一些線程池,對Runnable任務(wù)進(jìn)行管理。
任務(wù)主要是通過Handler來實現(xiàn)線程間的通訊。
》在display里解析DisplayImageOptions封裝的參數(shù)信息
》判斷對url==null作處理
》獲取key
String memoryCacheKey = MemoryCacheUtils.generateKey(uri, targetSize);
++DisplayImageOptions.Builder在初始化build()的時候,如果用戶沒有設(shè)置某些參數(shù),它會自動
進(jìn)行一些默認(rèn)設(shè)置,通過DefaultConfigurationFactory這個類。
public ImageLoaderConfiguration build() { initEmptyFieldsWithDefaultValues(); return new ImageLoaderConfiguration(this); }
++initEmptyFieldsWithDefaultValues方法進(jìn)行的一些主要的初始化操作:
如diskCache、memoryCache、downloader等,很好地體現(xiàn)了面向?qū)ο蟮木幊趟枷搿?/p>
private void initEmptyFieldsWithDefaultValues() { if (taskExecutor == null) { taskExecutor = DefaultConfigurationFactory .createExecutor(threadPoolSize, threadPriority, tasksProcessingType); } else { customExecutor = true; } if (taskExecutorForCachedImages == null) { taskExecutorForCachedImages = DefaultConfigurationFactory .createExecutor(threadPoolSize, threadPriority, tasksProcessingType); } else { customExecutorForCachedImages = true; } if (diskCache == null) { if (diskCacheFileNameGenerator == null) { diskCacheFileNameGenerator = DefaultConfigurationFactory.createFileNameGenerator(); } diskCache = DefaultConfigurationFactory .createDiskCache(context, diskCacheFileNameGenerator, diskCacheSize, diskCacheFileCount); } if (memoryCache == null) { memoryCache = DefaultConfigurationFactory.createMemoryCache(context, memoryCacheSize); } if (denyCacheImageMultipleSizesInMemory) { memoryCache = new FuzzyKeyMemoryCache(memoryCache, MemoryCacheUtils.createFuzzyKeyComparator()); } if (downloader == null) { downloader = DefaultConfigurationFactory.createImageDownloader(context); } if (decoder == null) { decoder = DefaultConfigurationFactory.createImageDecoder(writeLogs); } if (defaultDisplayImageOptions == null) { defaultDisplayImageOptions = DisplayImageOptions.createSimple(); } } }
》根據(jù)key從緩存中獲取Bitmap
Bitmap bmp = configuration.memoryCache.get(memoryCacheKey);
判斷緩存中有沒有得到Bitmap
LoadAndDisplayImageTask,從網(wǎng)絡(luò)上下載圖片位于tryLoadBitmap()這個方法當(dāng)中
通過BaseImageDecoder這個類的decode方法下載網(wǎng)絡(luò)圖片,通過BaseImageDownloader獲得輸入流,
網(wǎng)絡(luò)請求采用的是HttpURLConnection。
Freco圖片加載框架:
1.緩存
在5.0以下系統(tǒng),Bitmap緩存位于ashmem,這樣Bitmap對象的創(chuàng)建和釋放將不會引發(fā)GC,更少的GC會使你的APP運行得更加流暢。
5.0及其以上系統(tǒng),相比之下,內(nèi)存管理有了很大改進(jìn),所以Bitmap緩存直接位于Java的heap上。
當(dāng)應(yīng)用在后臺運行是,該內(nèi)存會被清空。
2.漸進(jìn)式JPEG圖
Fresco 支持漸進(jìn)式的網(wǎng)絡(luò)JPEG圖。在開始加載之后,圖會從模糊到清晰漸漸呈現(xiàn)。
你可以設(shè)置一個清晰度標(biāo)準(zhǔn),在未達(dá)到這個清晰度之前,會一直顯示占位圖。
漸進(jìn)式JPEG圖僅僅支持網(wǎng)絡(luò)圖。
3.漸進(jìn)式JPEG圖