2011-12-29 18 views
0

私はスレッドを実行して安全に停止することができましたが、別のスレッドを開始するのに最適なのは何ですか?スレッドを再起動できないので、新しいスレッドを作成する必要があります。ここでスレッドを再起動する

は、私が何を意味するかです:

1自動的に呼び出さ)最初のスレッド - シンプルなカウンターのような行為は、

2のスレッドの「実装して実行可能な」メソッドを使用して作成された)このスレッドを中断ボタンを持っていますそのスレッドが中断される前に相互作用した最後の値を格納します。

3)次のボタンは新しいスレッドを呼び出し、その値を開始点として使用する必要があります。以下のコードで私の最初の刺し傷である:

@Override 
public void run() 
{ 
    Log.v( TAG,"Runnable"); 

    if(isRunning) 
    { 
     Log.v( TAG,"Runnable -> Inside While Loop"); 

     counter.setText(" "+i); 
     setCounter(i); 

     handler.postDelayed(this, 1000); 
     i++; 

    } else if(!isRunning) 
    { 
     if(Thread.currentThread().isAlive()) 
     { 
      Thread.currentThread().interrupt(); 
      Log.v("Current Thread:", ""+Thread.currentThread().toString()  ); 
     } else { 

      // Thread not alive 
     } 

    } 
} 

と再開スレッド方法:

// Cannot restart a thread - you have to create a new one! 
public void resumeThrd() 
{ 
    // isRunning = true; 
    Log.v("isRunning Value:", "TRUE"); 

    // Create a new Thread to run 
    newThrd = new Thread(this); 
    newThrd.start(); 
} 

そう - どのように私はそれについて行けば?入力を許可し、私の再開メソッドでそれを呼び出すために私の元のスレッドメソッドを改造する必要がありますか?これは安全ですか、元のスレッドはまだアクティブになり、新しいものを作成すると状況が遅くなりますか?

最後に、新しいスレッドを正しく作成するにはどうすればよいですか?

答えて

0

Runnableを別様に作成し、Handlerを使用してRunnablesのすべてを管理することをおすすめします。したがって、最良の答えはHandlerを使用してスレッドを管理することです。あなたがhandler.postDelayed(runnable, 1000);を発射すると、ボタンの上のRunnableを停止する必要が再びRunnableを呼び出すために、あなたのケースで

Handler handler = new Handler(); 
handler.postDelayed(runnable, 1000); 

Runnable runnable = new Runnable() { 

     @Override 
     public void run() { 
      Log.d("runnable started", "inside run"); 
      handler.removeCallbacks(runnable); 
      handler.postDelayed(runnable, 1000); 
     } 
    }; 

だから、基本的にあなたがやっていることは、ハンドラを使用して実行可能を停止して、作成されhandler.removeCallbacks(runnable);

+0

を呼び出します新しいものとそれを実行している? – Katana24

+0

はい、while(true){}を使用してスレッドを実行する代わりに、これはAndroidが提供する最適なオプションです。 –

関連する問題