Android之多线程生成GIF

本文介绍了如何将单线程的GIF生成代码改造成多线程处理,通过任务拆分和合并,优化了GIF制作的效率。虽然线程池和线程创建阶段耗时较长,但实际生成40张图片的GIF只需2-3秒,性能表现良好。提供了项目源码链接及使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文主要是记录一下修改他人源码

主要工作在于将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)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值