アクティビティ間で転送されるデータは一般に比較的単純ですが、実際の開発ではより複雑なデータが転送されることもあります。特に、アクティビティ間で大量のデータを転送する必要がある場合はどうすればよいかというインタビューの場合はそうです。
Intentの転送データサイズには制限があります。転送できるデータは1M~8K程度です。これは、Binderロックマッピングのメモリサイズが1M~8Kであるためです。一般的にアクティビティ間のデータ転送はバインダーを使用するため、これは次のようになります。データ転送のサイズの制限。では、アクティビティ間で大規模なデータを転送するにはどのような方法を使用すべきでしょうか? 実際には、さまざまな方法があります。いくつかの例を挙げて説明しますが、それはデータ永続性またはメモリ共有ソリューションを使用することに他なりません。一般に、ビッグ データのストレージは、SP、MMKV、および DataStore の使用には適していません。
アクティビティ間で大量のデータを転送するには、いくつかの方法があります。
- Lruキャッシュ
- 永続化 (sqlite、ファイルなど)
- 匿名共有メモリ
LruCache を使用する
LruCache は、キャッシュの管理に役立つキャッシュ戦略です。これについて詳しく知りたい学生は、まず Glide の章に進んで学習してください。現在の問題では、LruCache を使用してデータを転送として保存できます。たとえば、大量のデータをアクティビティ B に転送するには、アクティビティ A が必要です。最初にアクティビティ A でデータを LruCache に書き込み、次にそれを読み取ることができます。 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を超えないようにするため、ここでサイズを設定する必要があります。
LruCache<String, Object> mCache = new LruCache<>( 10 * 1024*1024);
私たちが使用するデータの書き込みは比較的簡単です。
@Override
public void put(String key, String value) {
mCache.put(key, value);
}
例えば上記でString型のデータを書いた場合、受信したデータを全て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。
今日分享到此结束,对你有帮助的话,点个赞再走呗,每日一个面试小技巧
关注公众号: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零基础入门到精通,高手进阶之路