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); }
③. 然后通过Fresco的方式去实现他们
④. 主项目引用此lib 之后就可以随意使用这些接口了
3.这样做的好处
方便重用 独立的library工程 嵌入到其他工程的时候只需做简单的配置就能使用。
稳定 接口相对抽象 而且重构代价小 不会有牵一发动全身的痛苦
方便替换 之前项目使用的是UIL(universal image loader) 在经过横向比较之后发现fresco优势最大 加载速度快 尤其内存控制方面优势明显
但是之前的代码只简单包装了一下就在项目中到处使用 修改的时候费了不少功夫 所以这一次把引用封装在底层 想替换 就用新方案重新实现上面的接口 再做些局部调整即可 不会耗费过多精力
4.思考
要根据不同的环境条件选择不同的方式
像我们这种小创业团队 就不自己造轮子了
有朝一日我们的团队发展壮大了 也许会勇敢的做更多的尝试。