Android架构那些事之第三方库的隔离

简介:

在进入主题之前我们先说一下app客户端为什么需要有一个好的架构。

我们都知道一个好的架构会使我们的开发变得事半功倍。

设计架构的目的在于使我们的客户端易于扩展、方便单元测试、可复用。

做到使模块之间低耦合,模块内部高内聚。

我们在开发的过程中会不可避免的引用一些第三方库,比如网络请求库、图片加载库等等。就拿我们的图片加载库来说,程序中不会只有一个地方来引用到此库,可能有N个类会用到此库来显示图片。比如我们现在使用Universal-Image-Loader来展示客户端需要的图片,客户端总共有10个类使用该来显示图片。迭代了两个版本后老板突然说APP经常出现显示图片出现OOM的问题,我们需要将Universal-Image-Loader换成更高效的Picasso来显示图片。

听到这个需求我们的第一反应是"天哪,鬼知道项目里有多少个地方引用了ImageLoader库,我们得改多少代码,万一改代码的时候引发了其他的bug怎么办"。

问题来了我们应该如何避免这种“牵一发而动全身”的囧况。

好了,我们先来看下我们平常是怎么在项目中引用图片加载库的。

before.png

上图是我们大多数人的做法。那么我们怎么才能做到换了一个第三方加载库而是这四个引用类不做改动呢。

下面看下我们重新新设计之后的引用流程图

after.png

从上图我们能看到我们通过一个中间层来引用“第三方图片加载库”。这样做的好处是不管第三方图片加载库你换成Picasso还是Glide我们改变的只是这个中间层,其他的我们一行代码都不需要改动。

如果当时你是这样设计的当老板让你把Universal-Image-Loader换成Picasso时你一行代码也不用改动只需要扩展一个类就可以了。好了话不多说 我们来看代码如何设计。

我这里是使用代理模式来实现代码与图片加载库的隔离的。

首先抽象一个ImageLoader接口


  
  
  1. ** 
  2.  * 图片加载器功能接口; 
  3.  * 添加或者替换新的图片加载器实现该接口即可 
  4.  */public interface ImageLoader {    /** 
  5.      * Init ImageLoader 
  6.      */ 
  7.     void init(Context context);    /** 
  8.      * Show Image 
  9.      * 
  10.      * @param imageUrl 
  11.      * @param imageView 
  12.      * @param defaultImage 
  13.      */ 
  14.     void displayImage(String imageUrl, ImageView imageView, int defaultImage); 
  15.  }  

我们当前是使用UniversalImageLoader来展示项目中的图片我们就建一个UniversalImageLoader类来实现上面的接口


  
  
  1. public class UniversalImageLoader implements ImageLoader {    private final long discCacheLimitTime = 3600 * 24 * 15L;    private com.nostra13.universalimageloader.core.ImageLoader imageLoader = com.nostra13.universalimageloader.core.ImageLoader.getInstance();    @Override 
  2.     public void init(Context context) {        if (!imageLoader.isInited()) { 
  3.             ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder( 
  4.                     context) 
  5.                     .threadPriority(Thread.NORM_PRIORITY) 
  6.                     .denyCacheImageMultipleSizesInMemory() 
  7.                     .memoryCache(new WeakMemoryCache()) 
  8.                     .memoryCacheSize((2 * 1024 * 1024)) 
  9.                     .memoryCacheSizePercentage(13) 
  10.                     .discCacheFileNameGenerator(new Md5FileNameGenerator()) 
  11.                     .discCache(                            new LimitedAgeDiskCache(StorageUtils 
  12.                                     .getCacheDirectory(context), 
  13.                                     discCacheLimitTime)) 
  14.                     .tasksProcessingOrder(QueueProcessingType.LIFO).build(); 
  15.             com.nostra13.universalimageloader.core.ImageLoader.getInstance().init(config); 
  16.         } 
  17.     }    @Override 
  18.     public void displayImage(String uri, ImageView img, int default_pic) { 
  19.         DisplayImageOptions options = new DisplayImageOptions.Builder() 
  20.                 .showImageOnLoading(default_pic) 
  21.                 .showImageForEmptyUri(default_pic).showImageOnFail(default_pic) 
  22.                 .cacheInMemory(true).cacheOnDisc(true
  23.                 .bitmapConfig(Bitmap.Config.RGB_565) 
  24.                 .displayer(new SimpleBitmapDisplayer()).build(); 
  25.         imageLoader.displayImage(uri, img, options); 
  26.     } 

接下来我们写一个代理类来帮我们实现图片加载的任务


  
  
  1. /** 
  2.  * 图片加载代理类,所有的图片操作都通过该代理类去实现; 
  3.  * 如果要改变图片加载框架,只需要在该类里替换相应的图片加载框架即可,客户端所有引用的图片操作都不需要修改 
  4.  
  5.  */public class ImageLoaderProxy implements ImageLoader {    private ImageLoader imageLoader;//代理对象 
  6.     private static ImageLoaderProxy imageLoaderProxy;    public static ImageLoaderProxy getInstance() {        if (imageLoaderProxy == null) { 
  7.             imageLoaderProxy = new ImageLoaderProxy(); 
  8.         }        return imageLoaderProxy; 
  9.     }    public ImageLoaderProxy() { 
  10.         imageLoader= new UniversalImageLoader(); 
  11.     }    @Override 
  12.     public void init(Context context) { 
  13.         imageLoader.init(context); 
  14.     }    @Override 
  15.     public void displayImage(String imageUrl, ImageView imageView, int defaultImage) { 
  16.         imageLoader.displayImage(imageUrl, imageView, defaultImage); 
  17.     } 
  18.  }  

这样客户端所有需要显示图片的地方只需要调用代理类的图片显示方法即可 ImageLoaderProxy.getInstance().displayImage();

当老板让我们换成Picasso来完成图片加载时 ,我们只需增加一个 PicassoImageLoader类然后将代理类中的这行代码 imageLoaderProxy = new UniversalImageLoader();换成imageLoaderProxy = new PicassoImageLoader()即可。

怎么样我们只改动一行代码就替换了一个图片加载库方便吧。




本文作者:佚名
来源:51CTO
目录
相关文章
|
1月前
|
前端开发 JavaScript 测试技术
android做中大型项目完美的架构模式是什么?是MVVM吗?如果不是,是什么?
android做中大型项目完美的架构模式是什么?是MVVM吗?如果不是,是什么?
93 2
|
1月前
|
存储 前端开发 Java
Android MVVM架构模式下如何避免内存泄漏
Android采用MVVM架构开发项目,如何避免内存泄漏风险?怎样避免内存泄漏?
88 1
|
2月前
|
IDE Android开发 iOS开发
深入解析Android与iOS的系统架构及开发环境差异
本文旨在探讨Android和iOS两大主流移动操作系统在系统架构、开发环境和用户体验方面的显著差异。通过对比分析,我们将揭示这两种系统在设计理念、技术实现以及市场策略上的不同路径,帮助开发者更好地理解其特点,从而做出更合适的开发决策。
155 2
|
2天前
|
Android开发 Swift iOS开发
深入探索iOS与Android操作系统的架构差异及其对应用开发的影响
在当今数字化时代,移动设备已经成为我们日常生活和工作不可或缺的一部分。其中,iOS和Android作为全球最流行的两大移动操作系统,各自拥有独特的系统架构和设计理念。本文将深入探讨iOS与Android的系统架构差异,并分析这些差异如何影响应用开发者的开发策略和用户体验设计。通过对两者的比较,我们可以更好地理解它们各自的优势和局限性,从而为开发者提供有价值的见解,帮助他们在这两个平台上开发出更高效、更符合用户需求的应用。
|
4天前
|
Java Linux Android开发
深入探索Android系统架构:从Linux内核到应用层
本文将带领读者深入了解Android操作系统的复杂架构,从其基于Linux的内核到丰富多彩的应用层。我们将探讨Android的各个关键组件,包括硬件抽象层(HAL)、运行时环境、以及核心库等,揭示它们如何协同工作以支持广泛的设备和应用。通过本文,您将对Android系统的工作原理有一个全面的认识,理解其如何平衡开放性与安全性,以及如何在多样化的设备上提供一致的用户体验。
|
2天前
|
安全 Android开发 iOS开发
深入探讨Android与iOS的系统架构差异
本文旨在通过对比分析Android和iOS两大移动操作系统的系统架构,揭示它们在设计理念、安全性、应用生态及开发环境等方面的显著差异。我们将从底层架构出发,逐步剖析至用户界面层面,为开发者和科技爱好者提供一份详尽的技术参考。
8 1
|
11天前
|
前端开发 JavaScript 测试技术
android做中大型项目完美的架构模式是什么?是MVVM吗?如果不是,是什么?
在 Android 开发中,选择合适的架构模式对于构建中大型项目至关重要。常见的架构模式有 MVVM、MVP、MVI、Clean Architecture 和 Flux/Redux。每种模式都有其优缺点和适用场景,例如 MVVM 适用于复杂 UI 状态和频繁更新,而 Clean Architecture 适合大型项目和多平台开发。选择合适的架构应考虑项目需求、团队熟悉度和可维护性。
39 6
|
11天前
|
安全 搜索推荐 Android开发
深入探索Android与iOS的系统架构差异
【10月更文挑战第29天】 在当今的智能手机市场中,Android和iOS无疑是两大主流操作系统。本文旨在深入探讨这两个系统的架构差异,从底层的操作系统设计到用户界面的呈现,以及它们如何影响了开发者和用户的体验。通过对比分析,我们可以更清晰地理解这两种平台的优势与局限,为开发者在选择开发平台时提供有价值的参考,同时也为用户选择设备提供一定的指导。
29 2
|
20天前
|
前端开发 JavaScript 测试技术
Android适合构建中大型项目的架构模式全面对比
Android适合构建中大型项目的架构模式全面对比
39 2
|
21天前
|
存储 前端开发 测试技术
Android kotlin MVVM 架构简单示例入门
Android kotlin MVVM 架构简单示例入门
26 1