0

音楽の進行状況を示すシークバーを作成しようとしています。シークバーから親指のアイテムをドラッグすると、音楽の進行状況が実際の値を変更します。すべてのロジックは asynctask に実装されています。問題は、UIthread から asynctask をキャンセルして再度実行すると、メソッド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 に答える