# 面試看這就夠了 吧
## Reference Type v.s. Value Type
**Value Type 基本型態**: byte、short、int、long、float、double、boolean和char
宣告變數時配置記憶體位置,同時將實際值賦予變數
**Reference Type 參考型態**: 內建物件之陣列(矩陣)、字串,與自行設計之建構物件
這三種變數的值存放的是參考而非實值,也就是存放指向物件的位址。
宣告變數時配置記憶體位置,值為一段位置,要到heap區找實際值(實例資料會儲存在 Heap 中,Stack 內的變數值為實例在 Heap 中的記憶體位址)
資料的實值型別及參考型別:
https://tianchyi1955.pixnet.net/blog/post/101762587?pixfrom=related
JVM 的 Stack 和 Heap:
https://blog.marksylee.com/2016/09/14/java-interview-02-jvm-stack-heap/

## Thread & Handler
### Why & What Thread & Handler
當使用者啟動 APP 時,Android 會建立自己的 Linux process ,伴隨著這個 process,系統建立一個專門執行 APP 的 Thread (UI Thread),這個 Thread 就是我們俗稱的 Main Thread,它本身就是一個 Handler Thread。
Android 處理程式常須執行在多執行緒環境中,UI Thread被lock超過5秒以上會ANR,使用Handler 解決此問題。

### Key words
相關 class
**Runnable** : 工作,任務,run()
**Handler** : 不同 Thread 之間的溝通工具,提供 callback function 給其它 Thread 作執行,發送並處理與該 Thread 有關的 Message 和 Runnable
**Message** : 用來辨識要處理的 Runnable
**MessageQueue** : 緩衝,讓 Message 暫存
**Looper** : Looper取出訊息,處理 Message,一個線呈一個 Looper,處理完將 Message發送給 Handler
**Thread** : 處理程式
> #### **共同目標 : 讓程式能夠丟到其他 Thread 執行**
### Looper
1. Looper 提供了 Looper.prepare() 方法來創建 Looper
2. ThreadLocal 來實現與當前線程的綁定
3. Looper.loop() 則會開始不斷嘗試從 MessageQueue 中獲取 Message , 並分發給對應的 Handler
### Message
```kotlin=
val message = Message()
message.what = 1
message.arg1 = 123
//message.data
mainHandler.sendMessage(message)
.
.
// handler 內部
when (msg.what){
1 -> {
textView.text = "下載完成"
}
}
```
### Android 環境內,Thread 分兩種:
**單次Thread** : 做完即關閉
```java=
Thread t1 = new Thread(r1); //r1為Runnable (工作)
t1.start();
//start即開始工作,做完即結束
```
**常駐Thread** : HandlerThread,做完idle(閒置)
```java=
HandlerThread handlerThread = new HandlerThread("HandlerThread");
handlerThread.start();
Handler handler = new Handler(handlerThread.getLooper())
handler.post(r1)
handler.sendMessage(message)
......
handlerThread.quit()
//start待命,兩種形式post or sendMessage 給工作,做完idle,直到quit()才結束
```
**流程圖:**

HandlerThread run 方法內建立looper,loopr建立handler,handler發、處理信息
Handler 非同步更新UI,做執行續之間的通訊(子與Main)
HandlerThread 使用方式:
//參數:線呈名稱
mHandlerThread = new HandlerThread("HandlerThread");
handlerThread.start();
結束:釋放記憶體
mHandlerThread.quit()
建立handler時會先檢查該thread有無looper,沒有則throw exception,主線呈會自動建立looper所以不會拋錯
> 在創建 Handler 之前一定需要先創建 Looper
### Thread vs Memory Leak

非靜態的內部類別持有外部對象的引用,而Handler又由於Message的處理可能會常駐於process裡,導致雖然所在的Activity或Service在Destory後無法及時被GC回收,導致Memory Leak,因此比較建議使用static的寫法
> private Handler mUI_Handler = new Handler();
> 會建立一個基於Main Thread (UI Thread)的Handler
原文網址:https://kknews.cc/code/4k9abnx.html
https://codertw.com/android-%E9%96%8B%E7%99%BC/352565/
Handler版本改變
https://shoewann0402.github.io/2020/03/09/android-R-about-handler-change/
HT vs T 多looper
https://milochen.wordpress.com/2011/03/25/understanding-android-os-src-looperhandler-message-messagequeue/
## Program Process Thread
* #### Program (程式)
Program = Code
* #### Process ( 程序、進程 )
Process = 執行 APP 後,CPU 執行且 load 到記憶體的 Program
* #### Thread (執行緒、線程 )
Thread = Process 就是 Thread 的容器,一個 Process 中會有很多個 Thread ,每一個 Thread 負責某一項功能。