1. 程式人生 > >Android之多執行緒生成GIF

Android之多執行緒生成GIF

本文主要是記錄一下修改他人原始碼

原作者是在單執行緒裡處理的,將其修改為多執行緒處理

本篇所涉及內容在一個單獨的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)