Handler 夕陽下的奔跑

2021-09-12 06:52:49 字數 1349 閱讀 2317

主線程

private handler mhandler = new handler()}};

private void sendmessagetomainthreadbyworkthread()

}.start();

}

非主線程:

new thread()

};looper.loop();

}}.start();

handler、message、messagequeue、looper。

(使用者)把將要傳送的訊息放入到message中,handler通過sendmessage()將message傳送到messagequeue中。looper不斷呼叫loop()從messagequeue中取出message交給handler處理,從而實現執行緒中的通訊。

原因

建立handler內部類的時候,handler就隠式的持有activity的引用。當activity關閉的時候,執行緒的訊息尚未傳送,而執行緒持有handler的引用,handler又持有activity的引用,所以造成了activity無法被**,導致記憶體洩漏。如果這操作來回多次,就會程式占用記憶體超過系統限制,fc(系統崩潰)。

解決辦法:

將handler設為靜態類,並且將activity設為弱引用:

static class myhandler extends handler 

@override

public void handlemessage(message msg)

}}

a. android應用程式的訊息處理機制由訊息迴圈、訊息傳送和訊息處理三個部分組成的。

b. android應用程式的主線程在進入訊息迴圈過程前,會在內部建立乙個linux管道(pipe),這個管道的作用是使得android應用程式主線程在訊息隊列為空時可以進入空閒等待狀態,並且使得當應用程式的訊息佇列有訊息需要處理時喚醒應用程式的主線程。

c. android應用程式的主線程進入空閒等待狀態的方式實際上就是在管道的讀端等待管道中有新的內容可讀,具體來說就是是通過linux系統的epoll機制中的epoll_wait函式進行的。

d. 當往android應用程式的訊息佇列中加入新的訊息時,會同時往管道中的寫端寫入內容,通過這種方式就可以喚醒正在等待訊息到來的應用程式主線程。

e. 當應用程式主線程在進入空閒等待前,會認為當前執行緒處理空閒狀態,於是就會呼叫那些已經註冊了的idlehandler介面,使得應用程式有機會在空閒的時候處理一些事情。

喚醒機制主要是參考老羅的android應用程式訊息處理機制(looper、handler)分析。

那是我在夕陽下的code

布局 何如讓乙個標籤上下左右都居中?這有什麼難的,給定子標籤的寬,再讓它的邊距上下為0,左右為auto 如下 child 子標籤它就可以左右居中了。上下的話,就是讓父標籤展現成 子標籤展現成單元格並把vertical align屬性設定成middle就可以了 father child它就可以了上下也...

奔跑的秋天

奔跑的秋天 自古逢秋悲寂寥,我言秋日勝春朝 這個秋天,我們彼此遇見,一同歡笑,一同悲傷,一同在這個秋天奔跑。題記 秋天,帶著一股悲涼的風與一抹落葉的暗黃,輕輕地走來。今年的這個秋天,我們一起相聚在鳳凰樹下,以理想為帆,努力為舟,從這裡起航,駛向生命中的海洋 在這裡奔跑,奔往生命指向的方向。運動會上,...

秋天裡的夕陽

當蕭寂的長空中傳來孤雁一聲聲悲鳴,當垂柳的枯影倒垂在無力的河畔,當夕陽的餘暉洗禮著遊子內心的苦楚,當生命的號角在耳畔久久傳響,我已知道,這是人生的暮途,這是蒼茫的隱匿,這是跌宕的起伏,這是生命中的唯一伴侶。那就是你,我遲來的宿客,伴隨著我點滴人生的見證 秋天裡的夕陽。仰望著孤寂與蕭條的秋日長空,偶然...