0

オーディオファイルを再生するメソッドを呼び出すときにスレッドを開始しています。

コードは最初は問題なく実行されますが、playメソッドを再度呼び出すと、最初に呼び出されたかのようにスレッドを開始する必要があります。スレッドを中断し、停止しようとしましたが、何も機能しないようです。

どうすればスレッドを正しく再起動できますか?

説明に役立つコードを次に示します。

グローバル変数

private Thread thread1;

スレッドコード:

thread1 = new Thread(new Runnable() 
    {
        @Override
         public void run() 
        {
             try {
             int i=0;

             final TextView timeDuration = (TextView) findViewById(R.id.timeDisplay);
             final SeekBar seekBar = (SeekBar)findViewById(R.id.seekBar1);
             while (running)
             {
                info();
                j = 0;
                while(i>0 && running)
                {


                while(j<duration && running && (playStatus.getValue() == "TRANSITIONING" ||         playStatus.getValue() == "PLAYING"))
                {

                seekBar.setMax((int) duration);
                seekBar.setProgress(0);

                runOnUiThread(new Runnable() 
                { 
                                    public void run() 
                                    {
                                        System.out.println("PLAYBACK STATUS: "+playStatus.getValue());
                                        timeDuration.setText(""+(j+1));
                                        seekBar.setProgress(j+1);
                                            if(j==(duration-1))
                                        {
                                            setRunning(false);
                                        }

                                    }
                });
                Thread.sleep(1 * 1000);
                j++;
                if(seekBar.getProgress() == seekBar.getMax())
                {

                runOnUiThread(new Runnable() 
                    { 
                                        public void run() 
                                        {
                                            playButton.setVisibility(View.VISIBLE);
                                            pauseButton.setVisibility(View.GONE);
                                            timeDuration.setText(""+"0");
                                            seekBar.setProgress(0);
                                            flag = false;
                                            System.out.println("J VALUE 1: = "+j);
                                            duration = 0;
                                            setRunning(false); 
                                        }
                    });
                }

                }
                }

                j = 0;
                        i++;
                        Thread.sleep(1 * 1000);
                    }

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
         }
    });

    play();

このコードは正常に機能し、トラックを再生します。次に、シークバーをリセットし、playメソッドが再度呼び出されるのを待ちます。

public void play()
{

    try 
    { 

        thread1.start();
    } 
    catch(Exception e) 
    { 
            return; 
    }

}

これが私に推奨されるsetRunningメソッドです。

public void setRunning(boolean b)
{
      this.running = b;
}

誰かがこの問題の解決策を知っているなら、私は本当にそれをいただければ幸いです。

4

3 に答える 3

1

スレッドを手動で停止することは想定されていません。ループでtrueはなくブール値を使用し、停止したい場合はブール値をセッターに渡す必要があります。whilefalse

private boolean running;

@Override
public void run(){
  running = true;
  while(running) {...}
}

public void setRunning(boolean b){
  this.running = b;
}
于 2012-08-03T18:14:31.493 に答える
0

追加のブール値フラグを使用してスレッドの while ループを制御する場合は、volatile 修飾子を使用することを忘れないでください。

     private volatile boolean running;

または適切な同期を入れます。

それとは別に、追加の「実行中」フラグの代わりに Thread.isInterrupted() メソッドを使用することを考えます: http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html #isInterrupted()

理由は次のとおりです: https://stackoverflow.com/a/3196058/1350225

于 2012-08-14T20:21:53.403 に答える
0

プレーヤーを再起動するには、もう一度準備する必要があります。

    public void restartAudio() {
        Log.e(TAG, "restartAudio");
        if (mp.isPlaying()) {
            mp.seekTo(0);
        }else{
            mp.stop();
            try {
                mp.prepare();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
于 2012-08-06T13:29:09.593 に答える