java - 铃声停不下来
问题描述
我正在开发一个速度计应用程序,现在正在开发某种限速功能。这个想法是在速度大于目标值时发出噪音。我使用的代码:
Ringtone ringtone;
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
this.updateSpeed(null);
}
private void updateSpeed(Location location){
...
float speed = location.getSpeed();
int i = (int) speed;
this.doLimit(i);
}
private void doLimit(int i) {
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
ringtone = RingtoneManager.getRingtone(getApplicationContext(), notification);
if (i >= 50) {
this.lets_dance();
} else {
if (ringtone.isPlaying()) {
ringtone.stop();
}
}
}
private void lets_dance() {
ringtone.play();
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask(){
public void run(){
if(!ringtone.isPlaying()){
ringtone.play();
}
}
}, 1000, 1000);
}
问题是铃声第一次播放速度超过50就不停。
在我尝试了很多使用 Mediaplayer 和不使用 setLooping 的方法之前,情况更糟(它导致应用程序滞后,就像我在计算器上使用它一样)。
解决方案
这可能是因为每次调用 doLimit() 时,都会创建一个新的铃声实例。在 onCreate() 函数中尝试以下行:
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
ringtone = RingtoneManager.getRingtone(getApplicationContext(), notification);
推荐阅读
- php - 在php中获取并显示mysql中相同类型的所有值
- spring-boot - STS 中 Maven 项目的打包问题
- arrays - 制作二进制到十进制转换器,但需要将char数组转换为整数数组
- xamarin - Xamarin iOS 库无法获取位置
- c# - 如何使用 DotVVM 在浏览器中正确查看 pdf?
- visual-studio-code - 是否可以打开和编辑 vsix 包(VS 代码的扩展文件)?如果是,那么如何?
- java - 在另一个线程进入睡眠状态后移动到主线程
- spring-boot - HazelcastException:不能将 EqualPredicate 谓词与数组或集合属性一起使用
- postman - 无法从邮递员工具获取访问令牌
- vue.js - 在 vuejs 中挂载之前如何访问数据?