原程序:https://github.com/lexluthors/CompressTools-Android
工具特性:
- 这是和微信压缩效果雷同的压缩方式,采用底层压缩。
- 尽量无损压缩图片,保持清晰度最优。可以对比原生方法bitmap.compress(CompressFormat.JPEG, quality, fileOutputStream);
- 占用内存少,支持压缩天生原图分辨率图片
- 支持批量压缩,采用线程池提高性能
- 支持压缩监听回调
- 支持返回Bitmap和File 不支持x86架构
压缩情况对比:
ImageInfocompressToolWechat1.50MB (1920x1080)47.32kb(1280*720)51.4kb(1280*720)微信压缩图片样例:
这个是采用该库压缩后的图片:
原程序段已介绍完毕。根据纪录,原作者已于五年前停止更新了该项目,而最近一次大型更新为添加了批量压缩的功能。
笔者在阅读源代码与测试程序中发现,原作者编写的代码与程序存在以下问题。
- 在利用对象之前,未检查null引用,存在潜在的NullPointerException使得程序报错。
存在问题代码段- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data)
- {
- super.onActivityResult(requestCode, resultCode, data);
- if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK)
- {
- if (data == null)
- {
- showError("打开失败");
- return;
- }
- try
- {
- oldFile = getTempFile(this, data.getData());
- filePath = oldFile.getAbsolutePath();
- mainImageOld.setImageBitmap(BitmapFactory.decodeFile(oldFile.getAbsolutePath()));
- mainTextOld.setText(String.format("Size : %s", getReadableFileSize(oldFile.length())));
- }
- catch (IOException e)
- {
- showError("读图失败");
- e.printStackTrace();
- }
- }
- }
复制代码
- 程序的错误处理逻辑在方法中一同处理,导致代码的可读性与维护性极低。
修改样例- private void handleOpenError() {
- showError("打开失败");
- }
- if (data != null && data.getData() != null) {
- //省略无用代码段
- ...原方法...
- } else {
- handleOpenError();
- }
复制代码
- 未利用try-with-resources替代手动关闭流的方式,使得程序存在资源走漏的可能性。
修改样例- try (InputStream inputStream = context.getContentResolver().openInputStream(uri);
- FileOutputStream out = new FileOutputStream(tempFile)) {
- if (inputStream != null) {
- copy(inputStream, out);
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
复制代码无用注释略过不表,有兴趣可以前去原作者github页面下载master文件查看
笔者通过以上几个角度对软件举行了维护修复的二次开发。
虽然对于软件的底层算法,笔者暂且没有能力举行维护,但是对于利用过程中存在的恶性bug笔者已经举行了修复。
在修复这个项目中恶性bug的过程中,笔者深刻领会到了以下三个方面的重要性。
- 起首,问题的定位和分析是整个修复过程的关键。深入理解bug的根本原因不但仅是为了修复当前问题,更是为了增强对代码的理解和熟练度。这让笔者认识到在解决问题的过程中,深挖背后的原理是至关重要的。
- 其次,测试的重要性在这次修复中得到了再次印证。笔者发现全面而严谨的测试不但仅是为了确认修复的bug,更是为了保证代码的团体质量。这也提醒笔者在将来的开发中,必要更注重测试,以及构建完善的测试体系。
- 最后,通过这次修复,笔者对于维护和改进代码的意识理解也更为深刻。理解代码的生命周期,以及对于长期维护的重要性,使得笔者在软件开发者的成长道路上变得更加有远见。
写在最后与展望:本项目开源于github,在修复这些恶性bug的过程中,笔者认为开源对于一个软件寿命的连续起到了至关重要的作用。即使这份软件原作者已在五年前停止更新,但由于开源的性质,也使得笔者有机会举行二次开发。笔者在之后更会对于软件的其他缺点举行开发,笔者认为软件的ui界面已颠末时,对于Android设备的异型屏适配也不够完善。笔者之后将通过这两个角度对于软件举行进一步的更新,会同步于笔者的github与博客园举行发表供给阅读。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |