简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
1.前言
本篇目的:Android14之AudioFlinger如何使用和实现DefaultKeyedVector。
2.DefaultKeyedVector类介绍
-
DefaultKeyedVector类是Android开发中常用的一个数据结构,用于存储键值对数据。它继承自KeyedVector类,并在其基础上添加了键值对的存储和管理功能。DefaultKeyedVector类的主要作用是提供一个高效的方式来存储和操作键值对数据,并且在数据量较大时能够保持较低的内存占用和性能消耗。
-
与普通的Map类相比,DefaultKeyedVector类在一些场景下具有更好的性能表现。由于Android系统中对SparseArray类进行了优化,它在处理稀疏数据(大部分数据为空)时表现更加高效。因此,当需要存储大量键值对数据,且大部分数据为空时,DefaultKeyedVector类是一个更好的选择。
-
DefaultKeyedVector类提供了一系列方法来实现对键值对数据的操作,包括添加键值对、删除键值对、获取键值对数量、通过键获取值等功能。此外,DefaultKeyedVector类还提供了遍历键值对数据的方法,便于对数据进行批量处理。
-
在Android开发中,DefaultKeyedVector类常用于需要高效存储大量键值对数据的场景,比如在ListView、RecyclerView等列表控件中,用于存储列表项的数据。它能够在保证性能的同时,节约内存消耗,适用于移动设备资源有限的情况。
-
在处理大量键值对数据时能够提供较高的性能和较低的内存占用。使用DefaultKeyedVector类能够有效地提升应用程序的性能和响应速度,是开发中值得使用的工具之一。
3.AudioFlinger如何使用DefaultKeyedVector
<1>.DefaultKeyedVector定义
template <typename KEY, typename VALUE>
class DefaultKeyedVector : public KeyedVector<KEY, VALUE>
{
public:inline DefaultKeyedVector(const VALUE& defValue = VALUE());const VALUE& valueFor(const KEY& key) const;private:VALUE mDefault;
};
<2>.AudioFlinger使用DefaultKeyedVector
DefaultKeyedVector< audio_io_handle_t, sp<PlaybackThread> > mPlaybackThreads;
sp<AudioFlinger::ThreadBase> thread = mPlaybackThreads.valueFor(ioHandle);
4.实例
#include <iostream>
#include <map>template <typename KEY, typename VALUE>
class KeyedVector
{
};template <typename KEY, typename VALUE>
class DefaultKeyedVector : public KeyedVector<KEY, VALUE>
{
public:inline DefaultKeyedVector(const VALUE& defValue = VALUE()) : mDefault(defValue){ }const VALUE& valueFor(const KEY& key) const{auto it = mMap.find(key);if (it != mMap.end()) {return it->second;} else {return mDefault;}}void setValueFor(const KEY& key, const VALUE& value){mMap[key] = value;}private:std::map<KEY, VALUE> mMap;VALUE mDefault;
};int main() {// 创建一个 DefaultKeyedVector 对象,使用默认值进行初始化DefaultKeyedVector<int, std::string> vec;// 设置一个键的值vec.setValueFor(1, "one");vec.setValueFor(2, "two");// 获取一个键的值std::string value = vec.valueFor(2);// 打印结果std::cout << "Value for key 1: " << vec.valueFor(1) << std::endl;std::cout << "Value for key 2: " << value << std::endl;return 0;
}