¿Qué debo hacer cuando me encuentro con la necesidad de transferir una gran cantidad de datos entre actividades?

Los datos transferidos entre actividades son generalmente relativamente simples, pero a veces se transferirán algunos datos más complejos en el desarrollo real, especialmente cuando la entrevista pregunta qué hacer cuando se necesita transferir una gran cantidad de datos entre actividades.

El tamaño de los datos de transferencia de intención es limitado. Los datos que puede transferir son aproximadamente 1M-8K. La razón es que el tamaño de la memoria del mapeo de bloqueo de Binder es de 1M-8K. Generalmente, la transferencia de datos entre actividades usará Binder, por lo que esto se convierte en The límite en el tamaño de la transferencia de datos. Entonces, ¿qué método se debe usar para transferir grandes datos entre actividades? De hecho, hay muchas formas, vamos a darte algunos ejemplos para explicarlo, pero no es más que usar soluciones de persistencia de datos o uso compartido de memoria. Generalmente, el almacenamiento de big data no es adecuado para usar SP, MMKV y DataStore.

Hay varias formas de transferir grandes cantidades de datos entre actividades:
  • LruCache
  • Persistencia (sqlite, archivo, etc.)
  • memoria compartida anónima
Usar LruCache

LruCache es una estrategia de almacenamiento en caché que puede ayudarnos a administrar el caché. Los estudiantes que quieran saber más sobre esto pueden ir al capítulo Glide para aprender sobre esto primero. Bajo el problema actual, podemos usar LruCache para almacenar nuestros datos como una transferencia. Por ejemplo, necesitamos la Actividad A para transferir una gran cantidad de datos a la Actividad B. Podemos escribir datos en LruCache primero en la Actividad A y luego leerlos. de LruCache.

Primero, definimos las reglas de escritura y lectura:

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);
}

Podemos escribir clases de implementación específicas de acuerdo con las reglas, es decir, interfaces. En la clase de implementación, guardamos datos y usamos LruCache.Debemos establecer un tamaño aquí, porque se determina el valor máximo de datos en la memoria, y el tamaño de nuestros datos almacenados no debe exceder 1/8 del valor máximo.

LruCache<String, Object> mCache = new LruCache<>( 10 * 1024*1024);

Escribir los datos que usamos es relativamente simple:

@Override
public void put(String key, String value) {
    mCache.put(key, value);
}

Por ejemplo, si los datos de tipo String están escritos arriba, todos los datos recibidos deben colocarse en mCache.

La lectura de datos también es relativamente simple y conveniente:

@Override
public String getString(String key) {
    return String.valueOf(mCache.get(key));
}
Datos persistentes

Esa es la forma de sqlite, file, etc. Escriba los datos que deben transferirse en un archivo temporal o base de datos, y luego lea la información de datos cuando salte a otro componente.Este método de procesamiento conducirá a una baja eficiencia de operación del programa debido a la lectura y escritura de archivos que consumen mucho tiempo. Las características de este método son las siguientes:

Ventaja:

(1)应用中全部地方均可以访问

(2)即便应用被强杀也不是问题了

缺点:

(1)操做麻烦

(2)效率低下

匿名共享内存

在跨进程传递大数据的时候,我们一般会采用binder传递数据,但是Binder只能传递1M一下的数据,所以我们需要采用其他方式完成数据的传递,这个方式就是匿名共享内存。

Anonymous Shared Memory 匿名共享内存」是 Android 特有的内存共享机制,它可以将指定的物理内存分别映射到各个进程自己的虚拟地址空间中,从而便捷的实现进程间内存共享。

Android 上层提供了一些内存共享工具类,就是基于 Ashmem 来实现的,比如 MemoryFile、 SharedMemory。

今日分享到此结束,对你有帮助的话,点个赞再走呗,每日一个面试小技巧

关注公众号:Android老皮
解锁  《Android十大板块文档》 ,让学习更贴近未来实战。已形成PDF版

内容如下

1.Android车载应用开发系统学习指南(附项目实战)
2.Android Framework学习指南,助力成为系统级开发高手
3.2023最新Android中高级面试题汇总+解析,告别零offer
4.企业级Android音视频开发学习路线+项目实战(附源码)
5.Android Jetpack从入门到精通,构建高质量UI界面
6.Flutter技术解析与实战,跨平台首要之选
7.Kotlin从入门到实战,全方面提升架构基础
8.高级Android插件化与组件化(含实战教程和源码)
9.Android 性能优化实战+360°全方面性能调优
10.Android零基础入门到精通,高手进阶之路

Supongo que te gusta

Origin juejin.im/post/7264503091116965940
Recomendado
Clasificación