本文主要是记录一下修改他人源码
主要工作在于将GIFmaker,原文地址:https://github.com/mlapadula/GifEncoder
原作者是在单线程里处理的,将其修改为多线程处理
项目地址:https://github.com/CL-window/MyView,这是一个自定义view的集合,
本篇所涉及内容在一个单独的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)