gpt4 book ai didi

java - Android Media Player 搜索栏在停止后启动时不更新

转载 作者:行者123 更新时间:2023-12-01 06:20:31 24 4
gpt4 key购买 nike

我很难处理这个问题。

我有一个媒体播放器,我可以播放、暂停、停止、暂停后再次播放、停止......等等。现在我想要一个 SeekBar 来提供可视组件。我的问题是:当我第一次启动播放器时,一切正常。播放音乐并查找酒吧更新。当我暂停时也有效。

现在,如果我停止播放器并再次启动它,播放器将启动,run() 方法将执行,但搜索栏不会更新,很快应用程序就会给出无响应错误。我在这里缺少什么?

run 方法是 Runnable 接口(interface)的实现,通过简单的日志,我可以看到它正在执行,即使在停止/播放情况之后也是如此。唯一似乎不起作用的是seek.setProgress(...)。请帮忙吗? :)

这是我的代码:

public class MediaPlayerTestingActivity extends Activity 
implements OnClickListener, OnPreparedListener, Runnable {

private MediaPlayer mp;
private boolean paused = false;
private SeekBar seek;
private boolean threadStarted = false;;
private Thread thread = new Thread(this);


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

seek = (SeekBar)findViewById(R.id.seek);
mp = new MediaPlayer();

Button start = (Button)findViewById(R.id.start);
start.setOnClickListener(this);
Button pause = (Button)findViewById(R.id.pause);
pause.setOnClickListener(this);
Button stop = (Button)findViewById(R.id.stop);
stop.setOnClickListener(this);

}

//click handlers
public void onClick(View v)
{
int buttonId = v.getId();

switch (buttonId)
{
case R.id.start:
if(mp != null)
{
if(!mp.isPlaying() && !paused)
prepareTostartPlayer();
else
mp.start(); //if it was just paused
}
else
{
mp = new MediaPlayer();
prepareTostartPlayer();
}
break;
case R.id.pause:
if(mp.!= null && mp.isPlaying())
{
mp.pause();
paused = true;
}
break;

case R.id.stop:
if(mp != null && mp.isPlaying())
{
mp.stop();
mp.release();
mp = null;
}
break;

default:
break;
}
}

//When the player is ready to play
public void onPrepared(MediaPlayer arg0)
{
seek.setMax(mp.getDuration());
mp.start();
if(!threadStarted)
thread.start();
else
thread.run();
}

//Method to prepare to start the player
private void prepareTostartPlayer()
{
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mp.setDataSource("http://feedproxy.google.com/~r/rc-cadernetadecromos/~3/JH1kfZCmP3M/cdc_190112_2.mp3");
mp.prepareAsync();
mp.setOnPreparedListener(this);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

public void run()
{
threadStarted = true;
int current = 0;
while(mp != null && current < mp.getDuration())
{
try {
current = mp.getCurrentPosition();
seek.setProgress(current);
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

}

最佳答案

我在这里看到三个问题:

首先,这部分:

public void onPrepared(MediaPlayer arg0) 
{
seek.setMax(mp.getDuration());
mp.start();
if(!threadStarted)
thread.start();
else
thread.run();
}

第一次运行线程时,您在线程代码中将 threadStarted 设置为 true,但在以下情况下您从未将其设置回 false:线程结束。因此,在第一次运行后,它将永远为 true,因此上面的 else 将始终执行,按顺序运行播放器代码,从而阻塞您的用户界面。

第二,您正在从与 UI 线程不同的线程更新用户界面(SeekBar)。请参阅此相关问题,了解在这种情况下如何正确更新 UI:Update UI from Thread

第三,这可能只是一个建议,但由于您的 threadStarted 变量在线程之间被修改,所以最好将其声明为 volatile防止某些优化破坏您的代码:

private volatile boolean threadStarted = false;

关于java - Android Media Player 搜索栏在停止后启动时不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8952665/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com