Android中巧妙的实现缓存详解

 更新时间:2016年11月13日 14:56:05   投稿:daisy  
采用缓存,可以进一步大大缓解数据交互的压力,有的时候为了快速查询会被多次调用的数据,或者构建比较废时的实例,我们一般使用缓存的方法。无论大型或小型应用,灵活的缓存可以说不仅大大减轻了服务器的压力,而且因为更快速的用户体验而方便了用户。下面来一起看看吧。

前言

缓存有很多的实现方式,技巧性还有坑都很多,今天我给大家介绍一些非通用的方法,可以巧妙地帮大家简单实现一些内存缓存。

Supplier和Memoize

SQLite是Android里常用的一种数据存储方式,在访问数据库数据时需要通过SQLiteOpenHelper

一份好的数据库连接代码应该能解决以下几个问题:

     a) 构建实例比较费资源

     b) 数据库连接最好能复用

     c) onUpdate等方法在执行时不能和其他实例构成冲突。

这里可以很简单的这样写

Suppliers.memoize(new Supplier<SQLiteOpenHelper>() { 
 @Override
 public SQLiteOpenHelper get() {
 return new ...;
 }
})

这段代码利用了Guava提供的一些辅助方法实现Supplier和Memoize和逻辑。顾名思义,Supplier一般被用作factory,generator,builder,closure。Memoize类似于缓存这种概念,它一旦生成了一个实例,在以后的调用中都会返回同一实例,而且,线程安全。

这样写有几个好处,一是需要时才去构建实例,并不会在一开始就去阻塞程序的执行,二是它很简单的用memoize实现了缓存,保证只有一个实例生成。

代码注入

Glow是代码注入的重度使用者,它使我们的代码更加结构化,清晰,简单,同时还节省了不少的开发时间。

Dagger 2是我们实现注入的刀具,有兴趣的同学应该去网站多了解一下相关的内容。除了注入,它还有一些附赠功能,而这些恰巧能被我们用来实现缓存,而且还很简单,我们只需要额外用到几个annotation或接口而已。

@Singleton

相信大家对这个应该比较熟悉,这可是面试时的常问问题。简单来说,它就是单例。因为所以,用了它你不用再担心对这些实例怎么实现缓存了吧。

@Singleton
public class SingletonClass { 
}

@Reusable

这是一个新的很酷的功能。单例虽然很好,但有些时候实例可能有些太大,一直放在内存,又不能回收,暂时可能程序也用不到,怎么都感觉有些浪费。很多情况下,我们并没有那么严格的要求需要唯一的一个实例,能重用就重用,没有重新实例化一个就行。这就是@Reusable的使用场景,假如已有一个生成的实例,重用它就行,不行重新实例化,不需要保证。

@Reusable
public class ReusableClass { 
}

Lazy

Lazy使用的地方和前两者有些不同。@Singleton和@Reusable一般用在provides或类型定义的地方,但Lazy则是用在使用时,它的使用效果和最开始讲到的Supplier和Memoize类似。

@Inject
Lazy<SQLiteOpenHelper> lazySQLiteOpenHelper;

这里不会先生成SQLiteOpenHelper实例,直到你开始调用lazySQLiteOpenHelper.get() 。而一旦第一次实例化结束,以后的调用都会返回第一次的结果。

Observable

在使用app的过程中,很多数据需要从服务器端获取。在我们app里,每天会为用户提供一些订制化内容,这些内容短期内不会改变,每次从服务器端去取太过耗时,但放到数据库或文件这些持久化存储里似乎不太必要。综合考虑后,似乎内存缓存是个不错的选择。

于是这个缓存需要提供以下功能,首先,它是个缓存,其次,它的结构需要很简单,因为很多地方需要用到,再次,它得线程安全。

后来我们的实现方案很简单,利用Retrofit和Observable提供的一些方法。

private static final long EXPIRE_MS = 5 * 60 * 1000;
 private Pair<Long, Observable<Content>> cache;
 public synchronized Observable<Content> getDailyContent() {
 if (cache == null || cache.first + EXPIRE_MS < System.currentTimeMillis()) {
  cache = Pair.create(System.currentTimeMillis(), serverApi.getContent());
 }
 return cache.second;
 }

 这个方法的本质是利用Retrofit返回的Observable对象,然后Observable会提供一个类似缓存的cache方法,这样在subscribe之前,这个网络请求不会被发出,但一旦有了结果,后来的调用者都会得到同样的结果。

注意

缓存虽好,用起来很快捷方便,但在使用过程中,大家一定要注意数据更新和线程安全,不要出现脏数据。

总结

以上就是Android中巧妙实现缓存的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

相关文章

  • Android6.0获取GPS定位和获取位置权限和位置信息的方法

    Android6.0获取GPS定位和获取位置权限和位置信息的方法

    今天小编就为大家分享一篇Android6.0获取GPS定位和获取位置权限和位置信息的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Android图文居中显示控件使用方法详解

    Android图文居中显示控件使用方法详解

    这篇文章主要为大家详细介绍了Android图文居中显示控件的使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • Android如何实现蓝牙配对连接功能

    Android如何实现蓝牙配对连接功能

    Android 并没有开放配对连接耳机的接口,而且网上大部分资料都是讲解如何连接蓝牙4.0的,很少有资料详细介绍蓝牙2.0相关的。期间还是踩了不少坑才摸索出解决办法。所以把我自己摸索总结出来的经验梳理记录下,以便备份
    2021-05-05
  • Android使用ViewPager实现翻页效果

    Android使用ViewPager实现翻页效果

    这篇文章主要为大家详细介绍了Android使用ViewPager实现翻页效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • Android TCP 文件客户端与服务器DEMO介绍

    Android TCP 文件客户端与服务器DEMO介绍

    首先是服务器,服务器是在PC机上,JAVA运行环境,主要参考网上的代码,自己做了支持多线程处理,代码如下所示。需要的朋友可以过来参考下,希望对大家有所帮助
    2013-11-11
  • Android实现登录注册页面(上)

    Android实现登录注册页面(上)

    这篇文章主要为大家详细介绍了Android实现登录注册页面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Android解读Native崩溃栈信息的方法详解

    Android解读Native崩溃栈信息的方法详解

    大部分的 Android 开发者使用的主要语言都是 Kotlin / Java,他们的崩溃栈信息非常清晰,也非常好定位到问题,本文小编给大家介绍了Android如何解读Native崩溃栈信息,需要的朋友可以参考下
    2023-11-11
  • Android 出现问题Installation error: INSTALL_FAILED_CONFLICTING_PROVIDER解决办法

    Android 出现问题Installation error: INSTALL_FAILED_CONFLICTING_P

    这篇文章主要介绍了Android 出现问题Installation error: INSTALL_FAILED_CONFLICTING_PROVIDER解决办法的相关资料,需要的朋友可以参考下
    2016-12-12
  • Android 进度条显示在标题栏的实现方法

    Android 进度条显示在标题栏的实现方法

    android进度条显示在标题栏的实现方法,大概分文xml文件和java文件,具体代码内容大家可以通过本文学习下
    2017-01-01
  • Android PopUpWindow使用详解

    Android PopUpWindow使用详解

    PopupWindow与AlertDialog最关键的区别是AlertDialog不能指定显示位置,只能默认显示在屏幕最中间(当然也可以通过设置WindowManager参数来改变位置)。而PopupWindow是可以指定显示位置的,随便哪个位置都可以,更加灵活
    2021-10-10

最新评论