使用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.思考

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

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

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

原文地址:https://www.cnblogs.com/waterbear/p/5689077.html