Android入門 Handler的使用

2021-06-27 23:52:34 字數 2978 閱讀 3172

handler的使用

「android ui操作並不是執行緒安全的並且這些操作必須在ui執行緒中執行」。對於這句話的理解,真是費了很大勁啊,現在來說說這句話的意思,就是對於主介面中的控制項的操作,比如button上的文字改變,textview中的內容改變,顯示toast,progressbar更新等涉及控制項改變的操作,都必須在ui執行緒中進行,那要是我在乙個新執行緒中進行了某些操作,操作完成了,想要彈出乙個toast告訴使用者,這時是不能在新執行緒中直接呼叫toast的,於是handler的概念就出來了,通過傳送message資訊,在ui執行緒中呼叫handler物件接收message訊息,並根據收到的訊息內容進行不同的操作。這樣就解決了不能在ui執行緒意外的執行緒中改變ui控制項。

下面是handler的具體用法

一、handler的定義:

handler主要接收子執行緒傳送的資料, 並用此資料配合主線程更新ui,用來跟ui主線程互動用。比如可以用handler傳送乙個message,然後在handler的執行緒中來接收、處理該訊息,以避免直接在ui主線程中處理事務導致影響ui主線程的其他處理工作,android提供了handler作為主線程和子執行緒的紐帶;也可以將handler物件傳給其他程序,以便在其他程序中通過handler給你傳送事件;還可以通過handler的延時傳送message,可以延時處理一些事務的處理。

通常情況下,當應用程式啟動時,android首先會開啟乙個主線程 (也就是ui執行緒) , 主線程為管理介面中的ui控制項,進行事件分發。如果此時需要乙個耗時的操作,例如:聯網讀取資料,或者讀取本地較大的乙個檔案的時候,你不能把這些操作放在主線程中,如果你放在主線程中的話,介面會出現假死現象,如果5秒鐘還沒有完成的話,會收到android系統的乙個錯誤提示"強制關閉". 

這個時候我們需要把這些耗時的操作,放在乙個子執行緒中,因為子執行緒涉及到ui更新,但是當子執行緒中有涉及到操作ui的操作時,就會對主線程產生危險,也就是說,更新ui只能在主線程中更新,在子執行緒中操作是危險的. 這個時候,handler就出現了來解決這個複雜的問題,由於handler執行在主線程中(ui執行緒中),它與子執行緒可以通過message物件來傳遞資料,這個時候,handler就承擔著接受子執行緒傳過來的(子執行緒用sedmessage()方法傳遞)message物件,(裡面包含資料), 把這些訊息放入主線程佇列中,配合主線程進行更新ui。

二、handler的特點

handler可以分發message物件和runnable物件到主線程中, 每個handler例項,都會繫結到建立他的執行緒中(一般是位於主線程), 也就是說handler物件初始化後,就預設與對它初始化的程序的訊息佇列繫結,因此可以利用handler所包含的訊息佇列,制定一些操作的順序。

三、handler中分發訊息的一些方法

post(runnable)

postattime(runnable,long)

postdelayed(runnable long)

post類方法允許你排列乙個runnable物件到主線程佇列中

sendemptymessage(int)

sendmessage(message)

sendmessageattime(message,long)

sendmessagedelayed(message,long)

sendmessage類方法, 允許你安排乙個帶資料的message物件到佇列中,等待更新.

四、小例子

package com.example.testhandler;

import android.os.bundle;

import android.os.handler;

import android.os.message;

import android.os.systemclock;

import android.view.menu;

import android.view.view;

import android.view.view.onclicklistener;

import android.widget.progressbar;

import android.widget.textview;

import android.widget.toast;

/** * @author cen

*handler可以傳message物件,也可以傳runnable物件,就是執行緒物件

*其中對於message物件,是呼叫sendmessage()方法,對於runnable物件就是呼叫post()方法

*handler的使用方法:

*1.首先在子執行緒中建立message類的物件,並呼叫obtain方法,然後進行賦值,然後呼叫sendmessage()方法

*2.在主線程中建立新的handler物件,呼叫handlemessage()方法用於接收子執行緒傳來的訊息

*關於looper:

*looper是訊息佇列,預設只在主線程中建立,在其他執行緒中需要呼叫looper.prepare方法建立訊息佇列,然後呼叫looper.loop方法進入訊息迴圈

*handle只是針對那 些有looper的執行緒,不管是ui執行緒還是子執行緒,只要你有looper,我就可以往你的訊息佇列裡面新增東西,並做相應的處理。

*/public class mainactivity extends activity

private void inithandler() }};

} private void setlistener()

message msg=message.obtain();//迴圈結束後傳送,這裡沒有傳送任何值,只傳送了乙個標識碼

msg.what=download;//設定標識碼為download

mhandler.sendmessage(msg);

};}.start();

}});

} private void initview()

@override

public boolean oncreateoptionsmenu(menu menu)

}

Android中的Handle基礎應用一

下面來個例子 public class myhandleactivity extends activity catch interruptedexception e system.out.println sleep over message msg new message bundle b new ...

handle 控制代碼

控制代碼是乙個32位的整數,實際上是windows在記憶體中維護的乙個物件記憶體實體地址列表的整數索引。因為windows的記憶體管理經常會將空閒物件的記憶體釋放掉,當需要訪問時再重新提交到物理記憶體,所以物件的實體地址是變化的,不允許程式直接通過實體地址來訪問物件。程式將想訪問的物件的控制代碼傳遞...

控制代碼 Handle

最近在學習儲存方面的知識,第一次接觸控制代碼這樣的專業詞彙,為了更好的理解其中含義,決定開始寫部落格,慢慢成長 什麼是控制代碼?在作業系統中存在著許多的核心物件,這些物件具有許多的屬性,其中位址是比較重要的一種。作業系統在操作這些物件時,如果傳遞的是位址本身,將會帶來一系列的隱患,比如呼叫位址資訊複...