2017-07-31 56 views
1

這應該是一個快速的根目錄中啓動一個新線程...是否有意義的消息處理程序

我已經接管項目的發展從別人,在我看來,他們他們沒有弄清楚他們在做什麼。我發現了很多不好的代碼實踐和邏輯錯誤的例子,我相信它們會像我一樣使你的血液沸騰。我現在正在處理一個代碼領域,他們因爲一些未知的原因決定創建一個荒謬的消息處理程序。我認爲他們不明白什麼是處理程序...我有一個類包含多達4個處理程序作爲所有由同一個線程創建的類字段!其中一個處理程序是這樣的:

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都並行處理,那麼在這裏需要一個新的'Thread'(或者像ExecutorService'這樣的任何其他異步執行方式),如果它們要在背景'Thread'只是使用'HandlerThread' – pskink

+1

不知道你的軟件有什麼問題,很難說清楚爲什麼這樣做,但創建這樣的線程肯定不是一個好兆頭。如果軟件需要運行異步作業,那麼至少使用一個線程池,以「ExecutorService」的形式。 'Thread'的匿名子類中的'super.run();'調用也是不必要的。 – Jesper

+0

好點,我沒有這樣想過,所以一般情況下這可能是好的,但(得到這個)...這個處理程序實際上只在整個項目中使用過一次。這是在應用程序的激活過程中發生的一次性調用。所以並行處理多個消息的概念在這裏並不相關。所以我認爲這絕對是我前任完全無能爲力的另一個跡象!多謝你們。 – JeneralJames

回答

0

一個Handler總是朝着Thread指向。 處理程序收到消息時,最佳實踐是處理程序在其自己的線程上處理消息。這是首先創建Handler的全部要點。

Handler.handleMessage()開始一個新線程充其量是一個奇怪的選擇。