Android14之DefaultKeyedVector实现(一百八十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……
优质专栏:多媒体系统工程师系列原创干货持续更新中……

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

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 
#include 

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

你可能感兴趣的:(Android系统调试系列,android14)