1. 程式人生 > >android面試題-簡答題(一)

android面試題-簡答題(一)

(2)在其他執行緒(不是Handler繫結執行緒)中排入一些要執行的動作。

Scheduling Message,即(1),可以通過以下方法完成:
post(Runnable):Runnable在handler繫結的執行緒上執行,也就是說不建立新執行緒。
postAtTime(Runnable,long):
postDelayed(Runnable,long):
sendEmptyMessage(int):
sendMessage(Message):
sendMessageAtTime(Message,long):
sendMessageDelayed(Message,long):
post這個動作讓你把Runnable物件排入MessageQueue,MessageQueue受到這些訊息的時候執行他們,當然以一定的排序。sendMessage這個動作允許你把Message物件排成佇列,這些Message物件包含一些資訊,Handler的hanlerMessage(Message)會處理這些Message.當然,handlerMessage(Message)必須由Handler的子類來重寫。這是程式設計人員需要作的事。

當posting或者sending到一個Hanler時,你可以有三種行為:當MessageQueue準備好就處理,定義一個延遲時間,定義一個精確的時間去處理。後兩者允許你實現timeout,tick,和基於時間的行為。

當你的應用建立一個新的程序時,主執行緒(也就是UI執行緒)自帶一個MessageQueue,這個MessageQueue管理頂層的應用物件(像activities,broadcastreceivers等)和主執行緒建立的窗體。你可以建立自己的執行緒,並通過一個Handler和主執行緒進行通訊。這和之前一樣,通過post和sendmessage來完成,差別在於在哪一個執行緒中執行這麼方法。在恰當的時候,給定的Runnable和Message將在Handler的MessageQueue中被Scheduled。


Message簡介:
Message類就是定義了一個資訊,這個資訊中包含一個描述符和任意的資料物件,這個資訊被用來傳遞給Handler.Message物件提供額外的兩個int域和一個Object域,這可以讓你在大多數情況下不用作分配的動作。
儘管Message的建構函式是public的,但是獲取Message例項的最好方法是呼叫Message.obtain(),或者Handler.obtainMessage()方法,這些方法會從回收物件池中獲取一個。


MessageQueue簡介:
這是一個包含message列表的底層類。Looper負責分發這些message。Messages並不是直接加到一個MessageQueue中,而是通過MessageQueue.IdleHandler關聯到Looper。
你可以通過Looper.myQueue()從當前執行緒中獲取MessageQueue。


Looper簡介:
Looper類被用來執行一個執行緒中的message迴圈。預設情況,沒有一個訊息迴圈關聯到執行緒。線上程中呼叫prepare()建立一個Looper,然後用loop()來處理messages,直到迴圈終止。

大多數和message loop的互動是通過Handler。

下面是一個典型的帶有Looper的執行緒實現。
  class LooperThread extends Thread {
      public Handler mHandler;
     
      public void run() {
          Looper.prepare();
         
          mHandler = new Handler() {
              publicvoidhandleMessage(Message msg) {
                  // processincomingmessages here
              }
          };
         
          Looper.loop();
      }
  }
30、系統上安裝了多種瀏覽器,能否指定某瀏覽器訪問指定頁面?請說明原由。