【发布时间】:2012-01-21 11:36:55
【问题描述】:
我很难处理这个问题。
我有一个媒体播放器,我可以播放、暂停、停止、暂停后再次播放、停止……等等。 现在我想要一个 SeekBar 来提供一个视觉组件。我的问题是: 当我第一次启动播放器时,一切正常。音乐播放,并寻求酒吧更新。当我暂停时也有效。
现在,如果我停止播放器并重新启动它,播放器就会启动,run() 方法会执行,但 seekbar 不会更新,很快应用就会出现无响应错误。 我在这里想念什么?
run 方法是 Runnable 接口的一个实现,通过一个简单的日志,我可以看到它正在执行,即使在停止/播放情况之后也是如此。唯一似乎不起作用的是 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();
}
}
}
}
【问题讨论】:
-
“但是搜索栏没有更新”——这是什么意思?
-
搜索栏进度不更新。
-
但是如果它被暂停了,它应该在同一个地方,那么,你需要什么更新? --- 并阅读我的答案 - Android 中的线程几乎根本不起作用。
-
当我停止播放音乐时,我希望能够重新启动它。无法停止/重新启动音频文件将是一个限制。
-
停止/暂停/重启/恢复 - 哪个不起作用? Seekbar 进度是放置在进度条上的一个小东西。你说没有更新。这与重新启动或不重新启动有什么关系。看来,您的问题不止一个。把它们都一一写下来。不要混合它们。最好尝试放入不同的questuins。也一一管理它们,而不是同时管理它们。而且,朋友,如果你不能向我解释这个问题,不要以为你会向比赛解释——也许我没有那么聪明,但它更不聪明。
标签: java android multithreading seekbar android-mediaplayer