0

Handler と Runnable を使用して曲の 1 つのセグメントを繰り返していますが、ミリ秒ごとにチェックしているため、電話のバッテリーを消耗しているようです。これが私のコードです:

ユーザーがループを開始するたびに、次のことを行います。

anotherHandler.post(mPlayLoopTask); 

anotherHandler は先頭で宣言されたグローバル変数です」

         private Handler anotherHandler = new Handler();

これが私のランナブルです:

    private Runnable mPlayLoopTask = new Runnable() {


        public void run() 
           {

                if( mp != null)
                {
                    if( isLoopOn && start_position != -1 && end_position != -1 )
                    {
                        long currentPosition = mp.getCurrentPosition();




                        if( currentPosition >=end_position )
                        {
                            mp.seekTo(start_position);
                        }
                    }


                    anotherHandler.post(this);
                }
           }
        };

パフォーマンスを向上させる方法はありますか?

4

2 に答える 2

0

また、もし私があなたならAudioTrackクラスを試してみます。

setLoopPoints(int startInFrames, int endInFrames, int loopCount)

ループポイントとループ回数を設定します。

setPlaybackHeadPosition(int positionInFrames)

再生ヘッドの位置を設定します。

setPlaybackPositionUpdateListener(AudioTrack.OnPlaybackPositionUpdateListener listener)

以前に設定されたマーカーに到達したとき、または定期的な再生ヘッド位置の更新ごとに、AudioTrack が通知するリスナーを設定します。

setPlaybackPositionUpdateListener(AudioTrack.OnPlaybackPositionUpdateListener listener, Handler handler)

以前に設定されたマーカーに到達したとき、または定期的な再生ヘッド位置の更新ごとに、AudioTrack が通知するリスナーを設定します。

于 2013-03-04T03:50:32.153 に答える
0

コードでは、ハンドラーのキューに少なくとも 1 つの Runnable が常に存在します。スレッドはフレームごとに 1 回だけでなく、保留中のメッセージを継続的に実行するため、これは本当に問題です。

あなたの場合、スリープ/待機を伴う Android AsyncTask がおそらくより適切です。

必要に応じて、ここでドキュメントと例を確認できます: https://developer.android.com/reference/android/os/AsyncTask.html

于 2013-03-04T03:41:55.263 に答える