我正在尝试为我的媒体播放器编写A-B重复功能。我已经尝试了一个具有条件if语句的Runnable函数,当它到达B标记时,它将通过使用mediaplayer.getCurrentPosition()函数保存音频流中的位置而返回到开始标记。我也尝试了一个while循环,在应用程序冻结时也产生了令人不满意的结果。这是我对此方法的当前代码。
public void aButton() {
start = mediaPlayer.getCurrentPosition();
}
public void bButton() {
pressedCount += 1;
System.out.println("AB Button Count: " + pressedCount);
stop = mediaPlayer.getCurrentPosition();
mediaPlayer.seekTo(start);
if(mediaPlayer.getCurrentPosition() == stop){
mediaPlayer.seekTo(start);
}
}
我最终解决了自己的问题我决定在程序中编写一个带有处理程序的runnable函数,以适应while循环而不必经历异常处理。我为音频流中的a和b拼接位置设置了计数器。我确保使用计数器aCount + = 1仅按下了两个按钮;和bCount + = 1.如果他们都被按下,程序会将控制传递给Runnable函数,该函数每隔100毫秒检查一次getCurrentPosition(),如果流是在停止位置或超过停止位置(在B按钮的开头定义)方法)它将寻找()在A按钮方法开始时定义的起始位置。然后,如果多次按下任一按钮,我设置恢复正常播放的方法。
以下代码显示了我对代码所做的更改:
public void aButton() {
start = mediaPlayer.getCurrentPosition();
if (aCount > 1 && bCount == 1) {
aCount = 0;
bCount = 0;
}
aCount += 1;
}
public void bButton() {
stop = mediaPlayer.getCurrentPosition();
if (bCount > 1 && aCount >= 1) {
bCount = 0;
aCount = 0;
}
if (aCount != 1) {
Toast.makeText(this, "Please press A first", Toast.LENGTH_SHORT).show();
bCount = 0;
}
if(bCount == 0 && aCount == 1){
bCount += 1;
}
System.out.println("AB Button Count: " + bCount);
/*mediaPlayer.seekTo(start);*/
abLoopHandler.removeCallbacks(abLoop);
abLoopHandler.postDelayed(abLoop, 100);
}
private Runnable abLoop = new Runnable() {
@Override
public void run() {
if (aCount == 1 && bCount == 1) {
int currPos = mediaPlayer.getCurrentPosition();
if (currPos >= stop) {
mediaPlayer.seekTo(start);
}
abLoopHandler.postDelayed(this, 100);
}
}
};
希望这可以帮助人们解决同样的问题!