Android之多執行緒生成GIF
阿新 • • 發佈:2019-01-30
本文主要是記錄一下修改他人原始碼
原作者是在單執行緒裡處理的,將其修改為多執行緒處理
本篇所涉及內容在一個單獨的gifencoder包下,使用在mainactivity裡
主其實還是使用的原作者的,我都是使用的繼承,修改了一部分程式碼
單執行緒修改為多執行緒任務,主要是任務拆分以及任務合併,對於任務中的共享資源,尤其在分解使用多執行緒時需要注意
GIF檔案是有頭,尾,中間三部分,中間是主體,每一個執行緒都需要處理,頭部只讓處理第一段的執行緒處理,尾部只讓處理最後一部分的執行緒處理,
其實看這個執行的時間,看著也不是很快,告訴你哪裡費時間,主要是執行緒池以及執行緒的建立部分比較耗時,這裡可以單獨先生成全域性的執行緒池,我的是測試程式碼,就沒有處理,除去這個時間,40張圖片生成gif,時間在2-3秒之間,基本是可以接受的那種
使用很簡單,把gifencoder包下的幾個檔案拷貝到你專案裡,或者生成jar包也行,
使用時
new ClMakerGIF().makeGifThread(bitmapList, path,handler);
handler = new Handler(Looper.getMainLooper()){ @Override public void handleMessage(final Message msg) { if(msg.what == 100){ Log.i("slack","handle..."); addToView(path); } if(msg.getData().get("thread") != null){ runOnUiThread(new Runnable() { @Override public void run() { mLogTv.append("Thread:" + msg.getData().get("thread") + " cost time:" + msg.getData().get("cost_time") + "\n" ); } }); } super.handleMessage(msg); } };
/***
* 多執行緒處理同一個任務
* @param source 目前只做了 對 List<Bitmap> 的處理生成GIF
* @param outputPath 檔案輸出路徑
* @param hander 全部執行完需要回調
* @throws IOException
*/
public void makeGifThread(List<Bitmap> source, String outputPath, Handler hander)