停止public void run()Android

时间:2013-07-05 06:56:25

标签: android

我需要在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));

                            }

                        });


                }
        }

2 个答案:

答案 0 :(得分: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中阻塞的线程将设置其中断状态并立即返回。在这种情况下,他们不会收到例外。

  4. 我建议您使用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的所有待处理帖子。

答案 1 :(得分:0)

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

So what is the good practice to stop a thread?

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

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

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

尝试this link这是oracle doc,他们解释了线程中断