2011-12-07 16 views
1

質問には次のコードがあります。Androidスレッドはプロセスの途中でランダムに停止します

私が基本的にやりたいことは、配列のリストを持っていることです。「myArray」と言います。この配列には、格納されたミリ秒単位の時刻が格納されます。次に、これらの時点に基づいてメソッドを呼びたいと思います。したがって、音楽が再生されている間に0から時間カウンターを実行する必要があります。時間カウンターを配列のタイムポイントと順に(最初の配列インデックスから終了まで)比較してください。

最初のメソッド「timeCounter」は、音楽がMediaPlayerで再生されている間にタイムカウンターを開始する方法です。

public void timeCounter(){ 
    Runnable myRunnable = new Runnable(){ 
     @Override 
     public void run(){ 
      while(musicPlaying){ 
       startCounter(arrayPos); 
      } 
     } 
    }; 
    Thread musicPlayer = new Thread(myRunnable); 
    musicPlayer.start(); 
} 

ここで、アレイの時間カウンタと時間の比較が行われます。

public void startCounter(List<Long> array){ 
    elapsedTime = System.currentTimeMillis() - timeStart; 
    if(elapsedTime == array.get(arrayPos)){ 
     arrayPos += 1; //Continue comparing with the next number in the array 
     Log.v("DEBUG", "TIME MATCHES!"); 
     if(arrayPos>= array.size()){ 
      arrayPos= 0; //Prevent out of array index 
     } 
    } 
} 

私はコードが正しく動作しており、LogCatの結果は正しいです。

これで、スレッドが音楽の再生が完了するまで(私はonCompletionListenerを設定し、音楽が終了すると "musicPlaying"をfalseに設定する)、スレッドが実行されないことがあります。停止点はまったくランダムであり、開始されたばかりのとき、つまり約50%、または完了するまでになっているときもあります。時にはそれは始まらない! 私は理由を理解しようとしていましたが、途中で停止しているスレッドに関する情報をどこからでも見つけることができませんでした。前もって感謝します! =)

+0

スレッドが 'musicPlaying'変数のステータスで終了したときにメッセージを記録すると便利です。私は@Tudorにスポットがあり、 'musicPlaying'がスレッド間でランダムに更新されていると確信しています。 – Gray

+0

私がスレッド内に入れたログメッセージがアプリケーションを終了してもメッセージを表示していれば、それは 'musicPlaying'がプロセス全体を通して真実であることを意味します。 –

+0

@Grayメッセージはどこに記録すればよいですか?ルーパーにログを書き込むと、私のlogcatが氾濫し、スレッドは実行し続けて、アプリケーションを終了しても、musicPlayingの "true"を表示します。 –

答えて

1

if(elapsedTime == array.get(arrayPos))if(elapsedTime >= array.get(arrayPos))である必要があります。

ミリ秒タイマーは必ずしも1ミリ秒のティックを持つとは限りません。例えば、Windowsでは、返される値は15 ms程度にしか変化しません。したがって、あなたは完全に特定の時間を逃してしまい、あなたのリストのそのエントリーを過ぎてしまうことはありません。

+0

ああ、そうかもしれない。 OK、私はいくつかのテストを実行させて、後であなたに通知します –

+0

スポットに!私は '=='を使うのはカウンタの悪い習慣だと思います。どうもありがとう! =) –

2

musicPlayingが変更され、スレッド間で読み込まれる場合は、volatileと宣言されていることを確認してください。

+0

私は 'musicPlaying'を' volatile'に宣言しましたが、問題は依然として残っています。 –

+0

私に「volatile」を使用するように覚えてくれてありがとう、私がそれを使用しなかったなら別のエラーがあるかもしれません。 –