Android的四個基本概念(線程通信和GLSurfaceView)

GLSurfaceView提供瞭下列特性:

1> 管理一個surface,這個surface就是一塊特殊的內存,能直接排版到android的視圖view上。
2> 管理一個EGL display,它能讓opengl把內容渲染到上述的surface上。
3> 用戶自定義渲染器(render)。
4> 讓渲染器在獨立的線程裡運作,和UI線程分離。
5> 支持按需渲染(on-demand)和連續渲染(continuous)。
6> 一些可選工具,如調試。

關於ContenValues類

他和Hashtable比較類似,也是負責存儲一些名值對,但是他存儲的名值對當中的名是String類型,而值都是基本類型

Android中Looper的實現原理,為什麼調用Looper.prepare()就在當前線程關聯瞭一個Looper對象,它是如何實現的。

1、線程間通信機制

首先,looper、handler、messagequeue三者共同實現瞭android系統裡線程間通信機制。如在A、B兩個子線程之間需要傳遞消息,首先給每個子線程綁定一套handler、looper、messagequeue機制,然後這三個對象都與其所屬線程對應。然後A線程通過調用B線程的Handler對象,發送消息。這個消息會被Handler發送到B線程的messagequeue中,而屬於B線程的Looper對象一直在for循環裡無限遍歷MessageQueue, 一旦發現該消息隊列裡收到瞭新的消息,就會去對消息進行處理,處理過程中會回調自身Handler的heandleMessage方法。從而實現瞭不同線程間通信。

2、Looper實現原理

Looper類裡包含一個消息隊列對象和一個線程對象。當創建Looper時,會自動創建一個消息隊列,同時將內部線程對象指向創建Looper的線程。當開啟Looper後(looper.loop()),會自動進入無限for循環中,不斷去遍歷消息隊列,如果沒有消息則阻塞,有消息則回調handler的handlemessage方法進行處理。

3、Looper.prepare()

首先,要使用Looper機制一般會在當前線程中創建Handler對象,裡面會自動創建一個looper對象和消息隊列,這裡面的消息隊列屬於當前線程空間。但此時的looper還不會去遍歷,也沒有綁定到當前線程。其中,looper對象內部也包含一個空消息隊列對象和空線程。通過Looper.prepare()方法,先讓該消息隊列指向當前線程的消息隊列,讓空線程也指向當前線程。從而實現瞭綁定。

簡述Andriod如何處理UI與耗時操作的通信,有哪些方式及各自的優缺點。

主要有三種方法,一為Handler,二為AsyncTask,三為自己開子線程執行耗時操作,然後調用Activity的runOnUiThread()方法更新ui;
handler機制是,在主線程中創建handler對象,
當執行耗時操作時,新建一個線程,在這個線程中執行耗時操作,通過調用handler的sendMessage,post等方法,更新ui界面;

AsyncTask本質上是一個線程池,所有的異步任務都會在這個線程池中的工作線程中執行,當需要操作ui界面時,會和工作線程通過handler傳遞消息。

自己開子線程執行耗時操作,然後調用Activity的runOnUiThread()方法更新ui,這種方法需要把context對象強制轉換成activity後使用

handler機制的優點是 結構清晰,功能明確,但是代碼過多;
asyncTask簡單,快捷,但是可能會新開大量線程,消耗系統資源,造成FC
第三種方法最好用,代碼也非常簡單,隻是需要傳遞context對象

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *