2012-07-28 39 views
0

嗨Android开发人员,在Android中具有较大尺寸的内存缓存中

我想弄清楚一种方法来实现内存中的缓存;但与dvm堆大小相比,其大小将相对较大。我曾计划使用nio和/或Parcel类来序列化我的对象,然后将它们存储在本机内存中;但是我无法预测从字节中重建这些对象的性能。此外,我找不到任何有用的东西,教会如何使用Parcel和Parcelable来执行一些自定义序列化。我知道这是在android的IPC;并且我没有发现检查Parcel.cpp以了解Binder协议的内部结构,因此非常有趣且可行。另一方面,由于dvm堆大小限制,我无法使用LRUCache类,这意味着我将无法将我的java对象存储在dvm堆上。根据我迄今为止在网上的研究,超出dvm堆大小的唯一方法是告诉我的客户在安装我的应用程序之前先根据他们的设备(或者我误解了。如果是这样的话,请做纠正我),以便他们可以修改其设备的堆大小选项。

我试图避免NDK现在实现缓存,因为我必须将我的c/C++实例最终传递给java端。长期以来,任何开发人员都会告诉我实现内存缓存的最佳方法,该缓存可能会渗透dvm堆大小限制并且运行速度很快?或者至少,如果您可以向我发送一些链接,pdf,电子书,文档等,以供我查看;那真是太棒了!

感谢, Ilker GURCAN

+0

也许使用<机器人:largeHeap =“真”>在清单可以帮助您? – SteveR 2012-07-28 11:43:57

+0

不,我不这么认为......这个选项允许安装蜂巢的设备。我的应用程序应该至少在froyo(Android 2.2)上运行。 – iliTheFallen 2012-07-28 12:21:21

回答

0

使用ActivityManager的MemoryClass信息:

返回近似每个应用程序的内存类当前设备。这让您了解应该对应用程序施加的内存限制有多难以让整个系统发挥最佳效果。返回值以兆字节为单位;基准Android内存类为16(恰好是这些设备的Java堆限制);一些具有更多内存的设备可能会返回24甚至更高的数字。

因此,举例来说,你可以除以8的可用内存来建立你的内存缓存:

ActivityManager activityManager = (ActivityManager)context.getSystemService(Activity.ACTIVITY_SERVICE); 
int memoryClass = activityManager.getMemoryClass(); 
int memCacheSize = memoryClass/8 * 1024 * 1024; // bytes 
+0

嗨Chinaski,感谢您的快速回复;但我想知道是否真的没有办法从本地内存中分配(假设)50MB,并使用该空间以序列化形式存储我的对象(当然尽可能高效)?我的意思是;因为没有办法将我的Java对象原样存储在本机内存中。 – iliTheFallen 2012-07-28 09:22:32

+0

我认为没有办法做到这一点。至少,不是一件容易的事。 50 MB堆太多了,您的应用程序可能会损坏其他正在运行的应用程序的行为。无论如何,由getMemoryClass()方法提供的信息可能对您的问题有用,因为并非所有的deveices都具有相同的可用内存大小。祝你好运! – 2012-07-28 09:31:22

+0

我明白了......如果您对此有任何意见,最后一个问题......我看过海豚浏览器有时会消耗80-90MB的内存,当我检查任务管理器时。而对于我的设备(这是姜饼)堆大小限制是每个应用程序64MB。他们如何从你的角度实现这一目标?谢谢。 – iliTheFallen 2012-07-28 09:39:28