在非UI執行緒使用Handler

2021-08-29 09:58:06 字數 1697 閱讀 9120

handler物件所繫結的執行緒並不取決於該handler物件由哪個執行緒構建,而是取決於該handler物件所繫結的looper屬於哪個執行緒。

looper就像乙個訊息佇列(messagequeue)的管家,乙個訊息佇列只有乙個管家,並且管理者整個訊息佇列,而乙個訊息佇列內可以容納多個訊息(message),而工人(handler)也可以有多個,管家派遣他們向訊息佇列中儲存或取出訊息後執行任務;

所以它們的個數如下:

管家(looper): 1 個;

訊息佇列(messagequeue):1 個;

訊息(message):可以多個;

工人(handler):可以多個;

在非ui執行緒使用handler進行執行緒通訊時,一般都需要進行3個步驟:

如果你不帶引數例項化:handler handler=new handler();那麼這個會預設繫結當前執行緒的looper。

一般而言,如果你的handler是要來重新整理操作ui的,那麼就要在主線程下跑。有如下情況:

要重新整理ui,handler要用到主線程的looper。那麼在主線程handler handler=new handler();,如果在其他執行緒,也要滿足這個功能的話,要handler handler=new handler(looper.getmainlooper());

不用重新整理ui,只是處理訊息。 當前執行緒如果是主線程的話,handler handler = new handler();不是主線程的話,looper.prepare(); handler handler = new handler();looper.loop();或者handler handler = new handler(looper.getmainlooper());

若是例項化的時候用looper.getmainlooper()就表示放到主ui執行緒去處理。

如果不是的話,因為只有ui執行緒預設loop.prepare();loop.loop();過,其他執行緒需要手動呼叫這兩個,否則會報錯。

handler通過message通訊的基本方式:

使用looper.mylooper可以取得當前執行緒的looper物件。

使用mhandler = new handler(looper.mylooper());可產生用來處理當前執行緒的handler物件。

使用mhandler = new handler(looper.getmainlooper());可產生用來處理main執行緒的handler物件。

一般子執行緒傳送訊息或者修改主線程的ui的方法是,在子執行緒獲取主線程裡的handler物件,通過這個物件向主線程的messagequeue中傳送訊息,進行通訊或者操作。

比如在子執行緒中更新主線程中的ui,可以在子執行緒中通過mhandler.post(runnable r)將runnable加入到主線程的messagequeue中,然後主線程將呼叫runnable的方法,可以在此方法中更新主線程ui。

同樣也可以使用mhandler.sendmessage(message msg)向主線程中傳送訊息。

在非UI執行緒中自製Dispatcher

在c 中,task.run當然是乙個很好的啟動新並行任務的機制,但是因為使用這個方法時,每次新的任務都會在乙個新的執行緒中 其實就是執行緒池中的執行緒 執行 這樣會造成某些情形下現場排程的相對困難,即使我隔離出乙個與ui無關的物件,然後用ui執行緒的dispatcher實現對ui執行緒的互動,但是用...

Android在非UI執行緒中更新UI的方法

在ui thread中建立handler。用sendmessage message 或者obtainmessage result,obj sendtotarget 在handlemessage方法中更新ui。推薦使用obtainmessage result,obj sendtotarget 由於這種...

如何實現非ui執行緒更新ui執行緒?

1.實現非ui執行緒更新ui執行緒的 2.編碼中出現的乙個錯誤及 之前的基本做法是使用invoke實現,這裡採用的是 net 4.0中的task來實現,如下 using system using system.collections.generic using system.componentmod...