Android 手把手做視頻文件第一幀緩存

前言:

? ? ? ? ?在我剛剛完成的一個版本開發(fā)中太抓,有這樣的一個需求,我們選擇了多個視頻,進入到下面幾個層級的時候铺厨,需要把視頻文件的第一幀圖片展示在imageview上缎玫,對視頻做處理硬纤,在這個地方,怎樣把視頻第一幀圖像很快的取出來赃磨,就有了這篇文章筝家,以記錄開發(fā)中的點點滴滴,下面開始介紹邻辉。 ?

? ? ? ? ?1.場景設(shè)置為讀取手機的視頻文件溪王,gridview顯示視頻第一幀,顯示的速率不能太慢了值骇,選擇多個視頻莹菱,進入到第二層界面,界面要非持ù瘢快顯示出視頻的封面道伟。

? ? ? ? 2.now let's do it,首先第一步在項目的AndroidManifest清單文件中添加上讀取權(quán)限


AndroidManifest添加讀寫權(quán)限

? ? ? 3.第二步先獲出來的所有的視頻文件使碾,所以先定義視頻文件bean對象MediaModeVideo蜜徽,一個視頻文件的name,文件fileUrl,視頻文件時長票摇,現(xiàn)在定義單個的文件夾對象VideoPhotoFloder,這個對象我包含了視頻和圖片的集合對象拘鞋,但是這里我們只需要視頻集合。


MediaModeVideo視頻對象


VideoPhotoFloder視頻圖片文件夾對象

? ? ? ?3.第三步獲取手機里面的視頻文件矢门,有了對象了盆色,那還會單身嗎,哈哈??祟剔,寫一個util工具類獲取全部的視頻文件分文件夾都取出來隔躲,別忘了在界面打開的時候申請權(quán)限,不然就尷尬了峡扩,說什么都不如代碼實在蹭越。




獲取視頻util

? ? 獲取視頻的方法是調(diào)用Android 內(nèi)容解析器ContentResolver,查詢的5個參數(shù)uri教届,projection响鹃,selection驾霜,selectionArgs,sortOrder买置,具體5個參數(shù)的用處就自行學(xué)習吧》嗖冢現(xiàn)在方法已經(jīng)有了,可以拿到數(shù)據(jù)了忿项,界面上的繪畫就比較簡單了蓉冈,一個簡單的gridview,調(diào)用我們的util的獲取方法設(shè)置適配器就完事

界面調(diào)用獲取video集合方法

? ? ? 為了讓其他界面能快速的拿到視頻對象的第一幀,在這個適配器的里面就是我們要重點說的地方轩触。在adapter里面對視頻文件根據(jù)地址異步獲取第一幀做緩存寞酿,就是為了在后面的操作中可以快速的獲取到視頻的封面。


adapter中異步加載視頻第一幀調(diào)用

還是不說廢話上代碼脱柱,繼承AsyncTask伐弹,定義一次執(zhí)行線程數(shù)量最多10個個線程,


異步讀取視頻第一幀緩存

? ? ? ?因為我們定義了視頻和圖片兩種類型或者加了type類型作為BLGalleryCache讀取的條件之一


異步操作

? 我在異步處理中分配給自己做的緩存BLGalleryCache大小是進程內(nèi)存的1/8榨为,BLGalleryRetainCache一個單例類保證BLGalleryCache單例惨好,好了現(xiàn)在就介紹BLGalleryCache的作用,

bitmap的緩存類

? ? ? ? 緩存主要用的是LruCache,LruCache是android提供的一個緩存工具類随闺,其算法是最近最少使用算法日川。它把最近使用的對象用“強引用”存儲在LinkedHashMap中,并且把最近最少使用的對象在緩存值達到預(yù)設(shè)定值之前就從內(nèi)存中移除矩乐,就是醬紫??龄句,在adapter中單個new 出來的時候,從單例中獲取到mBitmapCache根據(jù)key取對應(yīng)的bitmap.在LruCache清理掉的時候绰精,開個AsyncTask再去取撒璧。


獲取bitmap

可以看到我設(shè)置了一個條件當不是在滑動的時候才去加載,在Scrolling的時候是沒有執(zhí)行task的笨使,這樣也只是為了不損耗資源吧卿樱。好了,最后一步了硫椰,在mBitmapCache里面沒有或者被清理的時候繁调,去AsyncTask地址Url獲取bitmap

private classBLBitmapLoaderTaskextendsAsyncTask {

privateBaseAdaptermAdapter;

privateStringmImageKey;

publicBLBitmapLoaderTask(String imageKey,BaseAdapter adapter) {

mAdapter= adapter;

mImageKey= imageKey;

}

@Override

protected voidonPreExecute() {

mCurrentTasks.add(mImageKey);

}

@Override

protectedBitmapdoInBackground(Void... params) {

Bitmap bitmap =null;

try{

bitmap = ThumbnailUtils.createVideoThumbnail(mImageKey,

Thumbnails.FULL_SCREEN_KIND);

if(bitmap !=null) {

bitmap = Bitmap.createScaledBitmap(bitmap,mMaxWidth,

mMaxWidth, false);

addBitmapToCache(mImageKey,bitmap);

returnbitmap;

}

return null;

}catch(Exception e) {

if(e !=null) {

e.printStackTrace();

}

return null;

}

}

@Override

protected voidonPostExecute(Bitmap param) {

mCurrentTasks.remove(mImageKey);

if(param !=null) {

if(mAdapter!=null)

mAdapter.notifyDataSetChanged();

}

}

}

直接上代碼了,傳遞adapter過來是為了讓界面刷新靶草,imageview是adapter里面調(diào)用的時候傳遞的holder .image.到此為止蹄胰,我們的緩存就搞出來了,核心就是利用LruCache其特性做這件事奕翔。好處就是什么呢裕寨,好處就是在我很深層級的地方,只要一個視頻的地址就可以輕松拿到bitmap。渲染速率宾袜,自然非衬硌蓿快,也完美的完成了項目的需求庆猫。需要調(diào)用的地方就是簡單的一行代碼搞定


最后顯示調(diào)用方法


代碼鏈接后面會附上∪瞎欤現(xiàn)在看下場景運行的效果


真機效果圖

? ? 因為限制10M,所以壓縮的挺厲害的月培,有些失真了嘁字,感謝大家的閱讀,希望對大家有一點點的促進杉畜,代碼會托管到git上纪蜒,鏈接隨后附上。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寻行,一起剝皮案震驚了整個濱河市霍掺,隨后出現(xiàn)的幾起案子匾荆,更是在濱河造成了極大的恐慌拌蜘,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,332評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牙丽,死亡現(xiàn)場離奇詭異简卧,居然都是意外死亡,警方通過查閱死者的電腦和手機烤芦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評論 3 385
  • 文/潘曉璐 我一進店門举娩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人构罗,你說我怎么就攤上這事铜涉。” “怎么了遂唧?”我有些...
    開封第一講書人閱讀 157,812評論 0 348
  • 文/不壞的土叔 我叫張陵芙代,是天一觀的道長。 經(jīng)常有香客問我盖彭,道長纹烹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,607評論 1 284
  • 正文 為了忘掉前任召边,我火速辦了婚禮铺呵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘隧熙。我一直安慰自己片挂,他們只是感情好,可當我...
    茶點故事閱讀 65,728評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著音念,像睡著了一般滋将。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上症昏,一...
    開封第一講書人閱讀 49,919評論 1 290
  • 那天随闽,我揣著相機與錄音,去河邊找鬼肝谭。 笑死掘宪,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的攘烛。 我是一名探鬼主播魏滚,決...
    沈念sama閱讀 39,071評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼坟漱!你這毒婦竟也來了鼠次?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,802評論 0 268
  • 序言:老撾萬榮一對情侶失蹤芋齿,失蹤者是張志新(化名)和其女友劉穎腥寇,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體觅捆,經(jīng)...
    沈念sama閱讀 44,256評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡赦役,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,576評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了栅炒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掂摔。...
    茶點故事閱讀 38,712評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖赢赊,靈堂內(nèi)的尸體忽然破棺而出乙漓,到底是詐尸還是另有隱情,我是刑警寧澤释移,帶...
    沈念sama閱讀 34,389評論 4 332
  • 正文 年R本政府宣布叭披,位于F島的核電站,受9級特大地震影響秀鞭,放射性物質(zhì)發(fā)生泄漏趋观。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,032評論 3 316
  • 文/蒙蒙 一锋边、第九天 我趴在偏房一處隱蔽的房頂上張望皱坛。 院中可真熱鬧,春花似錦豆巨、人聲如沸剩辟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贩猎。三九已至熊户,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吭服,已是汗流浹背嚷堡。 一陣腳步聲響...
    開封第一講書人閱讀 32,026評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留艇棕,地道東北人蝌戒。 一個月前我還...
    沈念sama閱讀 46,473評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像沼琉,于是被迫代替她去往敵國和親北苟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,606評論 2 350

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,832評論 25 707
  • 一打瘪、緩存介紹: (一)友鼻、Android中緩存的必要性: 智能手機的緩存管理應(yīng)用非常的普遍和需要,是提高用戶體驗的有...
    溫暖的外星閱讀 880評論 0 12
  • 【1009今日剽悍】 有時候父母的話并不中聽闺骚,但是他們的最終出發(fā)點都是為了讓你變得更好彩扔。 所以,不管父母的言辭如何...
    好聽的暖陽閱讀 207評論 0 0
  • 昨天和康康共讀《我的事情 我來做》《panda bear》《 晚安 小雞球球》 晚上看繪本進行的挺好的葛碧,會跟著看與...
    馬靖恩閱讀 225評論 2 1
  • 更易被時光帶走 此刻借杰,誰站在葉子頂端 誰就能摸到夢的指尖 人所不及的高度 露珠閃爍,仿佛神諭
    pj藍路閱讀 123評論 0 1