天天看點

android 子線程和主線程資料互動_騰訊Android面試:Handler中有Loop死循環,為什麼沒有阻塞主線程...

面試官: Handler中有Loop死循環,為什麼沒有阻塞主線程,原理是什麼

心理分析:該問題很難被考到,但是如果一旦問到,100%會回答不上來。開發者很難注意到一個主線程的四循環居然沒有阻塞住主線程

求職者:應該從 主線程的消息循環機制 與Linux的循環異步等待作用講起。最後将handle引起的記憶體洩漏,記憶體洩漏一定是一個加分項

先上一份整理好的面試目錄

android 子線程和主線程資料互動_騰訊Android面試:Handler中有Loop死循環,為什麼沒有阻塞主線程...

前言

Android的消息機制主要是指Handler的運作機制,對于大家來說Handler已經是輕車熟路了,可是真的掌握了Handler?本文主要通過幾個問題圍繞着Handler展開深入并拓展的了解。

站在巨人的肩膀上會看的更遠。大家有興趣的也可以到Gityuan的部落格上多了解了解,全部都是幹貨。而且他寫的東西比較權威,畢竟也是小米系統工程師的骨幹成員。

Questions

  1. Looper 死循環為什麼不會導緻應用卡死,會消耗大量資源嗎?
  2. 主線程的消息循環機制是什麼(死循環如何處理其它事務)?
  3. ActivityThread 的動力是什麼?(ActivityThread執行Looper的線程是什麼)
  4. Handler 是如何能夠線程切換,發送Message的?(線程間通訊)
  5. 子線程有哪些更新UI的方法。
  6. 子線程中Toast,showDialog,的方法。(和子線程不能更新UI有關嗎)
  7. 如何處理Handler 使用不當導緻的記憶體洩露?

回答一: Looper 死循環為什麼不會導緻應用卡死?

線程預設沒有Looper的,如果需要使用Handler就必須為線程建立Looper。我們經常提到的主線程,也叫UI線程,它就是ActivityThread,ActivityThread被建立時就會初始化Looper,這也是在主線程中預設可以使用Handler的原因。

首先我們看一段代碼

new Thread(new Runnable() { @Override public void run() { Log.e("qdx