【问题标题】:Android: Why is the constructor for SoundPool deprecated?Android:为什么不推荐使用 SoundPool 的构造函数?
【发布时间】:2016-08-27 17:58:54
【问题描述】:

这是否意味着我们不能再使用它了? 如果 min API 设置在 21 以下,我们应该使用什么? 此外,是否可以忽略警告,因为使用它构建的旧应用程序可以在新操作系统上运行?

【问题讨论】:

  • 关于“为什么开发人员 X 做 Y 事?”的问题不适合堆栈溢出。通常,唯一能提供明确答案的一方是开发者 X,而开发者 X 不太可能看到你的问题。其他人只能发表意见。 “这是否意味着我们不能再使用它了?” -- 欢迎您使用它,但对于minSdkVersion 为21 或更高的项目,您应该使用SoundPool.Builder。 “如果 min API 设置在 21 以下,我们应该使用什么?” -- SoundPool 构造函数,因为你别无选择。
  • 谢谢。那么这是否意味着如果我继续使用构造函数就不会出现问题?我也不能只使用 MediaPlayer 并注意到短声音没有问题吗?
  • "那么是不是说我继续使用构造函数就没有问题了?" ——暂时,是的。 “我也不能只使用 MediaPlayer 并注意到短声音没有问题吗?” -- SoundPool 提供不同于 MediaPlayer 的功能(例如,优先流)。我不会仅仅因为它的构造函数被弃用而避免SoundPoolSoundPool 是否总体上满足您的需求,我不能说。
  • 谢谢,我只是在一个应用程序中使用它们来了解它。我还在这里提供了一个答案:stackoverflow.com/questions/13527134/…
  • Deprecated meaning?的可能重复

标签: java android audio constructor deprecated


【解决方案1】:

为什么不推荐使用 SoundPool 构造函数

旧的SoundPool constructor 已被弃用,取而代之的是使用SoundPool.Builder 来构建SoundPool 对象。 old constructor 有三个参数:maxStreamsstreamTypesrcQuality

  • maxStreams 参数仍然可以是set with the Builder。 (如果不设置,则默认为 1。)
  • streamType 参数被替换为AudioAttributes,它比streamType 更具描述性。 (查看以here 开头的不同流类型常量。)使用AudioAttributes,您可以指定用法(播放声音的原因)、内容类型(什么你正在玩)和标记(如何玩)。
  • srcQuality 参数应该用于设置采样率转换器质量。但是,它从未实现过,设置也没有任何效果。

因此,SoundPool.Builder 比旧的构造函数更好,因为maxStreams 不需要显式设置,AudioAttributes 包含比streamType 更多的信息,并且消除了无用的srcQuality 参数。这就是旧的构造函数被弃用的原因。

使用已弃用的构造函数来支持 API 21 之前的版本

如果您愿意,您仍可以使用旧的构造函数并忽略警告。 “已弃用”意味着它仍然有效,但不再是推荐的做事方式。

如果您希望在仍支持旧版本的同时使用新的构造函数,您可以使用if 语句来选择 API 版本。

SoundPool mSoundPool;
int mSoundId;

//...

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
     mSoundPool = new SoundPool.Builder()
            .setMaxStreams(10)
            .build();
} else {
    mSoundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 1);
}

mSoundId = mSoundPool.load(this, R.raw.somesound, 1);

// ...

mSoundPool.play(mSoundId, 1, 1, 1, 0, 1);

关注this video了解更多详情。

【讨论】:

  • 感谢您的回答,所以如果这种构建对象的其他方式更具描述性,为什么不将其添加为另一个构造函数,因为java允许多个构造函数,为什么他们特别要采取步骤说这种方法不好用了吗?
  • @Harsha,使用Builder 不仅仅是添加一个新的构造函数。它是一个用于构建(或构造)SoundPool 的新类。这种设计模式似乎是一种趋势。 (例如,参见StaticLayout.Builder。)但即使他们只是添加一个新的构造函数,弃用不再推荐的旧构造函数也是相当普遍的(参见Java Date)。
【解决方案2】:

请改用SoundPool.Builder。创建 SoundPool 的方式已更改。我们鼓励您使用新方法。

【讨论】:

猜你喜欢
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多