0

我正在尝试制作一个显示音乐进度的搜索栏,当您从搜索栏拖动拇指项目时,音乐进度会改变其实际值。所有逻辑都在异步任务中实现,问题是当我从 UIthread 取消我的异步任务并再次执行时,方法publishProgress() 根本没有执行。其余的方法(doinbackground、onpreexecute..)每次都能正常工作。任何人都知道为什么会这样?关于我缺少的线程的一些事情。谢谢!

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) {

                }
            });

异步任务:

    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
    }
}
4

1 回答 1

0

您选择了一种非常非传统的方法来解决这个问题。应该不惜一切代价避免使用这样的东西:

    while (mediaplayer.isPlaying() || isCancelled()) {
        //code
        publishProgress(actual);
    }

人们使用AsyncTask应该在后台完成的事情,并且与“外部世界”没有太多互动。

如果你想制作一个媒体播放器,它应该由用户控制,但在后台工作,我建议你Service改用,将它绑定到你的Activity并来回发送数据来控制它。服务不会Activity消失,即使您退出界面部分,您仍然可以播放音乐。当你重新启动你的Activity,你可能会重新控制Service一次。

于 2013-03-10T03:23:53.953 回答