第二十一章 音频播放与单元测试
一. 音频播放
- 使用SoundPool
- 加载音频文件
- 播放音频
- 释放音频
1. 使用SoundPool
- 兼容低等级版本, 使用
SoundPool(int, int, int )
的构造方法. 另有SoundPool.Builder
方法. - 三个参数分别为
同时播放的个数, 音频流类型, 不起作用的采样率转换品质.
- 不同的音频流类型相互之间不会受影响. 在
AudioManager
类里可以看到其他控制选项. STREAM_MUSIC
时音乐和游戏常用的音量控制常量.
2. 加载音频
- 通过AssetsManager找到assets文件夹下的文件.
AssetFileDescriptor afd = mAssets.openFd(sound.getAssetPath());
- 存入
SoundPool
中, 并返回一个int类型的值.
int soundId = mSoundPool.load(afd, 1);
sound.setSoundId(soundId);
3. 播放音频
SoundPool.play(soundId, 1.0f, 1.0f, 1, 0, 1.0f);
- 参数分别为 音频ID, 左音量, 右音量, 优先级, 是否循环(0不循环, -1循环), 播放速率.
Integer soundId = sound.getSoundId();
if(soundId == null){
return;
}
mSoundPool.play(soundId, 1.0f, 1.0f, 1, 0, 1.0f);
4.释放音频
SundPool.release()
每次可在onDestory()
中调用.
二. 单元测试
- 添加测试依赖
- 创建测试类
- 创建虚拟对象
- 用
@Test
注解 - 运行测试
1.添加测试依赖
org.mockito:mockito-core
与org.hamcrest:hamcrest-junit
依赖- 将两个导入的依赖定义为
testImplementation
. 表明只需在应用的测试编译里, 而无需在APK包中添加无用的代码.
2.创建测试类
- 在视图模型文件中 使用快捷键
ctrl+shift+T
创建Junit测试类. - 选择setUp/@Before //以
@Before
注解的公共代码会在所有测试之前运行一次 - 选择test(单元测试). 另一个是androidTest(整合测试)
3.创建虚拟对象
BeatBox mBeatBox = mock(BeatBox.class);
4.用 @Test 注解
- 用
@Test
注解的测试方法
@Test
public void exposesSoundNameAsTitle(){
assertThat(mSubject.getTitle(), is(mSound.getName()));
}
@Test
public void callsBeatBoxPlayOnButtonClicked(){
mSubject.onButtonClicked();
verify(mBeatBox).play(mSound);
}
5.运行测试
整合测试(未完)(P351)
- 添加依赖esspresso-core依赖项, 作用范围改为
AndroidTestImplementation
相关小记
- 对于单元测试, 快速创建的Mokito非常有用.
- 对于整合测试, 避免使用mokito自动虚拟测试框架.
- 不可保存性有向外传递的机制
- 设备旋转造成的声音停止
在fragment
的onCreate()
中使用setRetainInstance(true)
, 此方法会保留fragment的实例以便于重建.
必须同时满足以下两个条件
1.调用了setRetainInstance(true)
2.因设备配置改变(通常为设备旋转), 托管activity正在被销毁. fragment只能保留非常短的时间. 如果是因为activity被系统回收内存而被销毁, 则所有保留的fragment也会随之被销毁, 数据也就跟着丢失.
挑战练习