0

私は AsyncTask を書きました:

public class AudioTransition extends AsyncTask <Void, Void, MediaPlayer>
{   
    private int goalID;
    private int milliseconds;
    private MediaPlayer tempPlayer;

    AudioTransition(int ID, int Milliseconds)
    {
        goalID = ID;
        milliseconds = (int)(((float)Milliseconds)/100);
    }

    @Override
    protected void onPreExecute()
    {
       tempPlayer = MediaPlayer.create(context, goalID);
       tempPlayer.setVolume(0, 0);
       tempPlayer.setLooping(true);
       tempPlayer.start();
    }

    @Override
    protected MediaPlayer doInBackground(Void... arg0) {

        for (int i = 0; i < 100; i++)
        {
            value = i;

            publishProgress();
            try {
                Thread.sleep(milliseconds);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            if (!player.isPlaying())
                tempPlayer.pause();
        }

        return tempPlayer;
    }

    @Override
    protected void onProgressUpdate(Void... v) {
        super.onProgressUpdate(v);
        player.setVolume(100-value, 100-value);
        tempPlayer.setVolume(value, value);
    }


    @Override
    protected void onPostExecute( MediaPlayer result )  {
          super.onPostExecute(result);
          player.reset();
          player = tempPlayer;
          player.setVolume(100,100);
          transitioning = false;
    }
}

でも音量は落ちません。両方のトラックを開始してから停止します。doInBackground が完了するまで、MediaPlayers は更新されません。 このタイプのバックグラウンド ワーカー内で MediaPlayers を更新するにはどうすればよいですか? publishProgress() が機能するはずです。

4

1 に答える 1

1

主よ。AsyncTask 内でスレッドをスリープ状態にしないでください。AsyncTask を完全に誤用しています。タイマータイプのことを行う別の方法を考えることができなかったので、AsyncTask を 1 つに使用する必要があるにもかかわらず、AsyncTask からの publishprogress のアイデアに固執しています (これは、私が思うようには機能しません)。 1 つだけ: メイン (UI) スレッドから離れて重い作業を行うこと。

ボリュームをフェードアウトしたいだけの場合は、次のようなものを使用します: (これはどのメソッドの外側にもあります)。

 private Runnable VolumeFadeRunnable = new Runnable() {
        @Override
        public void run() {
                volume--;
             player.setVolume(volume, volume);
                 if(volume>0)
               handler.postDelayed(this, 1000);
                 else
                   handler.removeCallbacks(this);
        }
    };

ハンドラーを onCreate などのフィールドとして初期化し、カウンター変数がそのランナブル内に表示されるようにします。

于 2012-07-24T20:36:27.343 に答える