0

我需要在 30 秒后或任何时候单击按钮时停止 run() 线程。我的问题是如何停止 public void run()。

   @Override
        public void run() {
            // TODO Auto-generated method stub
              int currentPosition= 0;
                int total = mp.getDuration();
                while (mp!=null && currentPosition<total) {
                    try {

                        Thread.sleep(1000);

                        currentPosition= mp.getCurrentPosition();
                    } catch (InterruptedException e) {
                        return;
                    } catch (Exception e) {
                        return;
                    }        

                    sbMusicProgress.setProgress(currentPosition);

                    /*MP3 PROGRESS*/
                    timer_count++;

                    runOnUiThread(new Runnable() {
                        public void run() {


                            if (timer_count<10)
                                context.txMp3Prog.setText("00:0"+String.valueOf(timer_count));
                            //Stop playlist after 30seconds

                            else if (timer_count==30){
                                timer_count=0;
                                context.txMp3Prog.setText("00:00");
                                mp.pause();
                                sbMusicProgress.setProgress(0);
                                btPlayMp3.setBackgroundResource(R.drawable.air_deezer_play);                        
                            }

                            else
                                context.txMp3Prog.setText("00:"+String.valueOf(timer_count));

                            }

                        });


                }
        }
4

2 回答 2

1

你可以调用interrupt你的线程。

http://developer.android.com/reference/java/lang/Thread.html

public void interrupt ()

向该线程发布中断请求。行为取决于此线程的状态:

  1. 在 Object 的 wait() 方法之一或 Thread 的 join() 或 sleep() 方法之一中阻塞的线程将被唤醒,它们的中断状态将被清除,并且它们会收到 InterruptedException。

  2. 在 InterruptibleChannel 的 I/O 操作中阻塞的线程将设置其中断状态并接收 ClosedByInterruptException。此外,通道将被关闭。

  3. 在 Selector 中阻塞的线程将设置其中断状态并立即返回。在这种情况下,他们不会收到异常。

我建议你使用Handler.

 int count =30;
 Handler m_handler;
 Runnable m_handlerTask ;
 m_handlerTask = new Runnable()
 {
     @Override 
     public void run() { 
   if(count>=0)
   {     
         // do something 
     count--;    
   }
   else
   {
    m_handler.removeCallbacks(m_handlerTask); // cancel the run                     
   } 
  m_handler.postDelayed(m_handlerTask, 1000);    
  }
  };
  m_handlerTask.run(); 

public final void removeCallbacks (Runnable r)

删除消息队列中所有待处理的 Runnable r 帖子。

于 2013-07-05T07:03:52.023 回答
0

我想提到的第一件事stop()是不推荐使用线程方法。

So what is the good practice to stop a thread?

答。run()您是否必须通过完成特定Thread的方法来完成线程的生命周期。

在您的情况下,尝试在 30 秒后或单击按钮完成该run()方法。setting one flag variable

@Raghunandan 提到的第二个解决方案。

试试这个链接,这是他们解释过的关于线程中断的 oracle 文档。

于 2013-07-05T07:14:42.513 回答