在Android应用程序生命周期中缓存数据的好方法?

时间:2010-04-20 15:15:21

标签: android android-contentprovider

保持我的问题简短,我创建了一个包含3个活动的应用程序,其中A - 类别列表,B - 项目列表,C - 单项。 B和C中显示的数据是从在线XML解析的。但是,如果我通过A - > B1 - > C,然后回到A然后再回到B1,我想将其数据缓存到某处,这样我就不必再次请求XML了。

我是Android和Java编程的新手,我已经搜索了很多内容,但仍然无法找到(或者根本就没有想法在哪里看),这是一种做我想做的事情。

将所有收到的数据存储在主要活动A(HashMaps?ContentProviders?)中,然后传递给B和C(如果他们得到之前的相同请求)是个不错的主意?

3 个答案:

答案 0 :(得分:13)

缓存信息或跟踪应用程序状态的一种简单快捷的方法是按照this blog post中的描述扩展应用程序

此博客文章忘记添加您必须在清单中设置 CustomApplication 类,例如:

<application [...] android:name="CustomApplication">

在我的项目中,我通过getInstance坚持单身式。

更多资源:this answerGlobal Variables in Android Appsthis blog post

答案 1 :(得分:2)

如果要在内存上构建某种缓存,请考虑使用带SoftReferences的Map。 SoftReferences是一种引用,可以将您的数据保留一段时间,但不会阻止它被垃圾回收。

手机上的内存很少,因此将所有内容保存在内存中可能并不实用。在这种情况下,您可能希望将缓存保存在设备的辅助存储中。

Google's Collections查看MapMaker,它可以方便地构建2级缓存。考虑这样做:

/** Function that attempts to load data from a slower medium */
Function<String, String> loadFunction = new Function<String, String>() {
    @Override
    public String apply(String key) {
        // maybe check out from a slower cache, say hard disk
        // if not available, retrieve from the internet
        return result;
    }
};

/** Thread-safe memory cache. If multiple threads are querying
*   data for one SAME key, only one of them will do further work.
*   The other threads will wait. */
Map<String, String> memCache = new MapMaker()
                                .concurrentLevel(4)
                                .softValues()
                                .makeComputingMap(loadFunction);

关于设备辅助存储设备上的缓存,请查看Context.getCacheDir()。如果你像我一样马虎,只要把所有东西留在那里,并希望系统能够在需要更多空间时为你清理东西:P

答案 2 :(得分:-1)

您可以按照Android参考中http://developer.android.com/guide/topics/data/data-storage.html

中的说明使用数据存储