• 使用fresco后引发的关于造轮子的思考


    1.背景(抱怨):

      一人支撑公司android端差不多快1年了 数不清掉进去、爬出来几次坑了。

      因为是小公司 deadline也不按照工作量去决定

      所以时间尽量都放在业务和交互效果

      剩下的各种基础功能全都要依靠三方的轮子了

      这张图大概可以说明一切了:

      

      例如其中fresco封装成独立工程pictureservice,volley封装异步任务在base中等等

    2.我怎么使用这些轮子

      ①. 独立的library工程pictureservice

      ②. 抽象 把项目中使用到的图片相关的功能抽象成接口 大概这个样子    

    public interface PictureService {
    
        /**
         * 保存图片到本地
         *
         * @param context
         * @param bitmap
         * @param path
         * @param fileName
         * @return
         */
        boolean saveBitmap(Context context, Bitmap bitmap, String path, String fileName);
    
        /**
         * 显示图片
         *
         * @param uri       图片资源路径
         * @param imageView 容器
         */
        void displayImage(String uri, ImageView imageView);
    
        /**
         * 显示图片
         *
         * @param uri       图片资源路径
         * @param imageView 容器
         * @param listener  监听器
         */
        void displayImage(String uri, ImageView imageView, OnCompleteListener listener);
    
        /**
         * 获得带有缩放功能的ImageView
         *
         * @param context        context
         * @param uri            图片资源路径
         * @param lowResImageUri 小图路径
         * @return ImageView
         */
        ImageView getPhotoView(Context context, String uri, String lowResImageUri);
    
        /**
         * 图片存储路径
         *
         * @return
         */
        String getPicDirPath();
    
        /**
         * 图片缓存路径
         *
         * @return
         */
        String getPicCacheDirPath();
    
        /**
         * 清理图片磁盘缓存
         */
        void clearMemoryCache();
    
        /**
         * 获取上传图片扩展名(有.) .jpg .webp
         *
         * @param picExtConfig 服务器扩展名配置
         * @return String
         */
        String getImageUploadExt(String picExtConfig);
    
        /**
         * 获取上传图片扩展名(无.) jpg webp
         *
         * @param picExtConfig 服务器扩展名配置
         * @return String
         */
        String getImageUploadExtNoDel(String picExtConfig);
    
        /**
         * 获取上传图片压缩类型
         *
         * @param picExtConfig 服务器扩展名配置
         * @return
         */
        Bitmap.CompressFormat getImageFormat(String picExtConfig);
    
        /**
         * 获得一个长宽最大为屏幕宽度的图片,另一边按比例缩放
         *
         * @param path 图片路径
         * @param dm   屏幕信息
         * @return
         * @throws IOException
         */
        Bitmap compressBitmap(String path, DisplayMetrics dm);
    
        /**
         * 根据下载url获取本地缓存文件流
         * 找不到返回null
         *
         * @param url
         * @return
         */
        InputStream getCacheInputStream(@NonNull String url);
    
    
        /**
         * 按照指定大小载入本地图片
         * @param imageView
         * @param path
         * @param width
         * @param height
         */
        void loadLocalImage(ImageView imageView, String path, int width, int height);
    }
    View Code

      ③. 然后通过Fresco的方式去实现他们

      ④. 主项目引用此lib 之后就可以随意使用这些接口了

    3.这样做的好处

      方便重用 独立的library工程 嵌入到其他工程的时候只需做简单的配置就能使用。

      稳定 接口相对抽象 而且重构代价小 不会有牵一发动全身的痛苦

      方便替换 之前项目使用的是UIL(universal image loader) 在经过横向比较之后发现fresco优势最大 加载速度快 尤其内存控制方面优势明显

    但是之前的代码只简单包装了一下就在项目中到处使用 修改的时候费了不少功夫 所以这一次把引用封装在底层 想替换 就用新方案重新实现上面的接口 再做些局部调整即可 不会耗费过多精力

    4.思考

      要根据不同的环境条件选择不同的方式

      像我们这种小创业团队 就不自己造轮子了

      有朝一日我们的团队发展壮大了 也许会勇敢的做更多的尝试。

  • 相关阅读:
    Java 截取目标长度英文单词字符串 要求避免截断单词
    mysql报Fatal error encountered during command execution的解决办法
    PostgreSQL 学习01 Centos7.6安装PostgreSQL10
    Ubuntu14.04 + KinectV2驱动安装 以及 Ros接口(基于网上方法试错 改进版)
    传统定位方法简介--------里程计、IMU惯性传感器以及光电编码器等
    Vue.js 动态绑定class
    MongoDB数据导入导出成csv或者json
    exception 'yiiaseErrorException' with message 'Class 'MongoClient' not found'
    exception 'DOMException' with message 'Invalid Character Error' Php + Mongodb
    浅谈Angular的 $q, defer, promise
  • 原文地址:https://www.cnblogs.com/waterbear/p/5689077.html
Copyright © 2020-2023  润新知