Android 需要终止并重新启动线程

Android 需要终止并重新启动线程,android,multithreading,thread-safety,Android,Multithreading,Thread Safety,调用方法播放音频文件时,我正在启动一个线程 代码第一次运行正常,但是当我再次调用play方法时,我需要线程像第一次被调用一样启动。我试图中断线程,甚至停止它,但似乎没有任何工作 如何正确地重新启动线程 下面是一些代码来帮助解释 全局变量 private Thread thread1; 线程代码: thread1 = new Thread(new Runnable() { @Override public void run() {

调用方法播放音频文件时,我正在启动一个线程

代码第一次运行正常,但是当我再次调用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();
下面是推荐给我的setRunning方法

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

如果有人知道这个问题的解决方案,我将非常感激。

线程不应该手动停止。您应该在
while
循环中使用布尔值而不是
true
,并在要停止时通过setter将布尔值设置为
false

private boolean running;

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

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

要重新启动播放机,您需要再次准备

    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();
            }
        }
    }

当使用额外的布尔标志控制线程的while循环时,不要忘记对其使用volatile修饰符:

     private volatile boolean running;
或者把适当的同步

除此之外,我还考虑使用Thread.isInterrupted()方法,而不是额外的“running”标志:

原因如下:

记录在循环中运行的状态,以确保其被更改。setRunning中有一个bug,行应该是这样的;没错。我试过这个改变,但仍然不起作用。我试图在3秒后将running的状态设置为false,但循环仍在运行。您是否也将布尔值设置为第二个while循环的状态?因为第二个循环似乎直到轨道的末端才停止。是的,我把布尔条件放在第二个和第三个while循环中。如果更改布尔状态,我现在可以在3秒钟后退出循环。看起来我已经退出了线程,但现在的问题是,调用play()方法时,我似乎无法再次启动线程。第三个循环中的条件不正确,末尾的| |将使循环保持运行,即使布尔值为false,因为您没有使用括号,所以布尔运算符从左到右执行。执行类似于while(运行&&(其余条件))的操作。可以从其他循环中删除布尔值。
     private volatile boolean running;