取消后不调用publishProgress并重新创建对象AsyncTask

时间:2013-03-09 20:53:56

标签: android android-asynctask

我正在尝试创建一个显示音乐进度的搜索栏,当您从搜索栏拖动拇指项时,音乐进度会改变其实际值。所有逻辑都是在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
    }
}

1 个答案:

答案 0 :(得分:0)

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

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

人们使用AsyncTask来完成应该在后台完成的事情,而不会与“外部世界”进行太多互动。

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