、、、之間的關係。
擷取當前線程中的對象,用來從存放的中取出,再有進行的分發和處理
訊息佇列:用來存放通過發布的訊息,通常附屬於某一個建立它的線程,可以通過得到當前線程的訊息佇列
:發行就緒或者處理一個訊息或者操作一個,通過發布訊息,訊息將只會發送到與它關聯的訊息佇列,然也只能處理該訊息佇列中的訊息
:是和訊息佇列之間通訊橋樑,程式組件首先通過把訊息傳遞給,把訊息放入隊列。也把訊息佇列裡的訊息廣播給所有的:接受到訊息後調用進行處理
:訊息的類型,在類中的方法中得到單個的訊息進行處理在單執行緒模式下,為了線程通訊問題,設計了一個訊息佇列,線程間可以通過該並結合和組件進行資訊交換。下面將對它們進行分別介紹:
訊息,理解為線程間交流的資訊,處理資料後台線程需要更新,則發送內含一些資料給線程。
處理者,是的主要處理者,負責的發送,內容的執行處理。後台線程就是通過傳進來的對象引用來。而使用,需要該類的方法,它是處理這些的操作內容,例如。通常需要子類化來實現方法。
訊息佇列,用來存放通過發布的訊息,按照先進先出執行。
都會有一個對應的。會向通過兩種方法發送訊息:或。這兩種訊息都會插在隊尾並按先進先出執行。但通過這兩種方法發送的訊息執行的方式略有不同:通過發送的是一個對象會被的函數處理;而通過方法發送的是一個對象,則會自己執行。
是每條線程裡的的管家。沒有的,而會自動替主線程線程建立,但在子線程裡並沒有建立。所以調用得到的主線程的不為,但調用得到當前線程的就有可能為。對於子線程使用,提供了正確的使用方法:這個機制的大概流程:
在方法運行開始後,迴圈地按照接收順序取出裡面的非的。
一開始裡面的都是的。當到,該函數裡面設定了那個對象的屬性是當前的對象。隨後取出了那個,則調用該的指向的的函數對進行處理。在方法裡,如何處理則由使用者指定,三個判斷,優先順序從高到低:
裡面的,一個實現了介面的對象,其中函數做處理工作;
裡面的指向的一個實現了介面的對象,由其進行處理;
處理訊息對象對應的類繼承並實現了其中函數,通過這個實現的函數處理訊息。
方法是優先順序最低的!
處理完該後,則設定該為,以便回收!
判斷對象裡面的對象是屬於哪條線程的,則由該線程來執行!
當對象的建構函式的參數為空白,則為當前所線上程的;
得到的是主線程的對象,得到的是當前線程的對象。
的啟動模式有哪些?是什麼含義?
(預設)、、、。
:它們都可以多次執行個體化,可位於任意的棧中,被啟動者和啟動者位於同一中(除非的為
::當前執行個體如果在棧頂,就不建立執行個體,調用其。如不在棧頂,則建立執行個體。模式,可用來解決棧頂多個重複相同的的問題。
:都是只建立一個執行個體的。
和有關的啟動方式有哪些?其含義?
FLAG_ACTIVITY_SINGLE_TOP
如果設定,當這個Activity位於曆史stack的頂端運行時,不再啟動一個新的
FLAG_ACTIVITY_BROUGHT_TO_FRONT
這個標誌一般不是由程式碼設定的,如在launchMode中設定singleTask模式時系統幫你設定。
FLAG_ACTIVITY_FORWARD_RESULT
如果設定,並且這個Intent用於從一個存在的Activity啟動一個新的Activity,那麼,這個作為回覆目標的Activity將會傳到這個新的Activity中。這種方式下,新的Activity可以調用setResult(int),並且這個結果值將發送給那個作為回覆目標的 Activity。
FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
這個標誌一般不由應用程式代碼設定,如果這個Activity是從記錄裡啟動的(常按HOME鍵),那麼,系統會幫你設定。
FLAG_ACTIVITY_NO_HISTORY
如果設定,新的Activity將不再曆史stack中保留。使用者一離開它,這個Activity就關閉了。這也可以通過設定noHistory特性。
FLAG_ACTIVITY_NO_USER_ACTION
如果設定,作為新啟動的Activity進入前台時,這個標誌將在Activity暫停之前阻止從最前方的Activity回調的onUserLeaveHint()。
的最佳化方案
、如果自訂配接器,那麼在方法中要考慮方法傳進來的參數是否為,如果為就建立並返回,如果不為則直接使用。在這個方法中儘可能少建立。
、給設定(()),傳入一個對象,用於緩衝要顯示的資料,可以達到映像資料非同步載入的效果。
、如果需要顯示的很多,就要考慮分頁載入。比如一共要顯示條或者更多的時候,我們可以考慮先載入條,等使用者拉到列表底部的時候再去載入接下來的條。
四十、程式運行時許可權與檔案系統許可權的區別