当遇到需要在Activity间传递大量的数据怎么办?
在Activity间传递的数据一般比较简单,但是有时候实际开发中也会传一些比较复杂的数据,尤其是面试问道当遇到需要在Activity间传递大量的数据怎么办?
Intent 传递数据的大小是有限制的,它大概能传的数据是1M-8K,原因是Binder锁映射的内存大小就是1M-8K.一般activity间传递数据会要使用到binder,因此这个就成为了数据传递的大小的限制。那么当activity间要传递大数据采用什么方式呢?其实方式很多,我们就举几个例子给大家说明一下,但是无非就是使用数据持久化,或者内存共享方案。一般大数据的存储不适宜使用SP, MMKV,DataStore。
Activity之间传递大量数据主要有如下几种方式实现:
- LruCache
- 持久化(sqlite、file等)
- 匿名共享内存
使用LruCache
LruCache是一种缓存策略,可以帮助我们管理缓存,想具体了解的同学可以去Glide章节中具体先了解下。在当前的问题下,我们可以利用LruCache存储我们数据作为一个中转,好比我们需要Activity A向Activity B传递大量数据,我们可以Activity A先向LruCache先写入数据,之后Activity B从LruCache读取。
首先我们定义好写入读出规则:
public interface IOHandler {
//保存数据
void put(String key, String value);
void put(String key, int value);
void put(String key, double value);
void put(String key, float value);
void put(String key, boolean value);
void put(String key, Object value);
//读取数据
String getString(String key);
double getDouble(String key);
boolean getBoolean(String key);
float getFloat(String key);
int getInt(String key);
Object getObject(String key);
}
我们可以根据规则也就是接口,写出具体的实现类。实现类中我们保存数据使用到LruCache,这里面我们一定要设置一个大小,因为内存中数据的最大值是确定,我们保存数据的大小最好不要超过最大值的1/8.
LruCachemCache = new LruCache<>( 10 * 1024*1024);
,>
写入数据我们使用比较简单:
@Override
public void put(String key, String value) {
mCache.put(key, value);
}
好比上面写入String类型的数据,只需要接收到的数据全部put到mCache中去。
读取数据也是比较简单方便:
@Override
public String getString(String key) {
return String.valueOf(mCache.get(key));
}
持久化数据
那就是sqlite、file等方式。将需要传递的数据写在临时文件或者数据库中,再跳转到另外一个组件的时候再去读取这些数据信息,这种处理方式会由于读写文件较为耗时导致程序运行效率较低。这种方式特点如下:
优势:
(1)应用中全部地方均可以访问
(2)即便应用被强杀也不是问题了
缺点:
(1)操做麻烦
(2)效率低下
匿名共享内存
在跨进程传递大数据的时候,我们一般会采用binder传递数据,但是Binder只能传递1M一下的数据,所以我们需要采用其他方式完成数据的传递,这个方式就是匿名共享内存。
「Anonymous Shared Memory 匿名共享内存」是 Android 特有的内存共享机制,它可以将指定的物理内存分别映射到各个进程自己的虚拟地址空间中,从而便捷的实现进程间内存共享。
Android 上层提供了一些内存共享工具类,就是基于 Ashmem 来实现的,比如 MemoryFile、 SharedMemory。
来源:juejin.cn/post/7264503091116965940