我正在尝试创建一个显示音乐进度的搜索栏,当您从搜索栏拖动拇指项时,音乐进度会改变其实际值。所有逻辑都是在asynctask中实现的,问题是当我从UIthread中取消asynctask并再次执行时,方法 publishProgress()根本没有执行。其余的方法(doinbackground,onpreexecute ..)每次都能正常工作。谁知道为什么会这样?关于我缺少的线程的东西。 THX!
seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
mediaplayer.seekTo(actual);
update = new updateUI();
update.execute();
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
update.cancel(true);
}
@Override
public void onProgressChanged(SeekBar seekBar,
int progress, boolean fromUser) {
}
});
的AsyncTask:
private class updateUI extends AsyncTask<Void, Integer, Void> {
@Override
protected Void doInBackground(Void... params) {
while (mediaplayer.isPlaying() || isCancelled()) {
//code
publishProgress(actual);
}
return null;
}
@Override
protected void onPreExecute() {
//code
}
protected void onProgressUpdate(Integer... progress) {
//code
}
}
答案 0 :(得分:0)
您选择了一种非传统方法来解决此问题。应该不惜一切代价避免使用这样的事情:
while (mediaplayer.isPlaying() || isCancelled()) {
//code
publishProgress(actual);
}
人们使用AsyncTask
来完成应该在后台完成的事情,而不会与“外部世界”进行太多互动。
如果您想制作媒体播放器,应该由用户控制,但在后台工作,我建议您使用Service
,将其绑定到Activity
并发送数据来回控制它。 Activity
消失后,服务不会消失,即使退出界面部分,您仍然可以播放音乐。当您重新启动Activity
时,您可能会再次控制Service
。