2017-07-31 9 views
1

のルートに新しいスレッドを開始しても意味がありません彼らが何をしていたかの手がかりを得ていない。私は悪いコードの実践と論理的な誤りの例をたくさん見つけました。私はあなたの血の沸騰を私のものと同じくらい確信しています。私は今、メッセージハンドラの不条理な量を作成することを決めたいくつかの未知の理由のために持っているコードの領域を扱っています。私は彼らがハンドラが何であるかを理解していないと思う...私は同じスレッドによってすべて作成されたクラスフィールドとして4ハンドラを含む1つのクラスを持っている!これらのハンドラの1つは、次のようになります役に立たない変数名のほかにそれは私が誰か他の人からのプロジェクトの開発を引き継いでいると、それはその彼らに私には思える</p> <p>...これは速いものでなければならないメッセージハンドラ

private Handler messageHandler1 = new Handler() { 
    public void handleMessage(final Message msg) { 
     super.handleMessage(msg); 

     new Thread() { // why are we starting a thread in the root of a message handler?! 
      public void run() { 
       super.run(); 

        // some code... 
      } 
     }.start(); 
    } 
}; 

、私は右のハンドラのルートに新しいスレッドを作成することによって、より心配です。ハンドラの理解は、別のスレッドでコードを実行できるようにするために使用されているため、あるスレッドが別のスレッドのハンドラを使用して他のスレッドでコードを実行できるようになっているということです。すぐに新しいスレッドを作成するつもりなら、最初のハンドラを使用してください。私はちょうど私がこのハンドラを取り除く前にそれを確認する(またはしない)もう少し知恵を持った人を欲していました。

おかげ

+0

これは、すべての 'Message'sを並行して処理する必要がある場合、' Thread'をここで(または 'ExecutorService'のような他の方法で非同期に実行する)必要があります。 'Threadler'は単に' HandlerThread'を使用します – pskink

+1

あなたのソフトウェアについて何も知らずに、なぜこのようにしたのかは分かりませんが、このようなスレッドを作成することは確かに良いことではありません。ソフトウェアが非同期ジョブを実行する必要がある場合は、少なくともExecutorServiceの形式でスレッドプールを使用します。 'Thread'の匿名サブクラスにおける' super.run(); '呼び出しも不要です。 – Jesper

+0

良い点、私はそのように考えなかったので、これは大丈夫かもしれませんが(これを得る)...このハンドラは、実際にはプロジェクト全体で一度だけ使用されます。これは、アプリケーションのアクティベーションプロセス中に発生するワンタイムコールです。したがって、複数のメッセージを並行して処理するという概念は、ここでは関係ありません。だから、これは間違いなく私の前任者の全く別の兆候だと思います!みんなありがとう。 – JeneralJames

答えて

0

Handlerは常にThreadに向かって指しています。 ハンドラがメッセージを受け取ったとき、ハンドラがそれ自身のスレッドでメッセージを処理することがベストプラクティスです。これは、最初にハンドラを作成する全体的なポイントです。

新しいスレッドを開始するにはHandler.handleMessage()内で新しいスレッドを作成することをおすすめします。

関連する問題

 関連する問題