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() メソッドの 1 つ、または Thread の join() または sleep() メソッドの 1 つでブロックされたスレッドは、起動され、割り込みステータスがクリアされ、InterruptedException を受け取ります。

  2. InterruptibleChannel の I/O 操作でブロックされたスレッドは、割り込みステータスが設定され、ClosedByInterruptException を受け取ります。また、チャンネルは閉鎖されます。

  3. セレクターでブロックされたスレッドは、割り込みステータスが設定され、すぐに戻ります。この場合、彼らは例外を受け取りません。

を使用することをお勧めします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?

答え。特定のThreadrun()のメソッドを完了することにより、スレッドのライフサイクルを完了する必要があります。

あなたの場合、30秒後またはボタンをクリックしてrun()メソッドを完了するようにしてください。setting one flag variable

@Raghunandanが言及した2番目の解決策。

スレッド割り込みについて説明したオラクルドキュメントであるこのリンクを試してください。

于 2013-07-05T07:14:42.513 に答える