轉(zhuǎn)帖|其它|編輯:郝浩|2010-08-26 14:54:36.000|閱讀 1905 次
概述:本文將以圖文結(jié)合德方式講解 Android Handler 線程消息機(jī)制。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
android 有一種叫消息隊列的說法,這里我們可以這樣理解:假如一個隧道就是一個消息隊列,那么里面的每一部汽車就是一個一個消息,這里我們先忽略掉超車等種種因素,只那么先進(jìn)隧道的車將會先出,這個機(jī)制跟我們android 的消息機(jī)制是一樣的。
Android 的線程消息機(jī)制
android 在設(shè)計的時候引入了 wince 的消息機(jī)制,即將每一個消息發(fā)送到隊列里面,遵循先進(jìn)先出原則。發(fā)送消息并不會阻塞線程,而接收線程會阻塞線程,這是因為 Android 的Handler 機(jī)制,當(dāng)Handler 處理完一個 Message 對象才會接著去取下面一個消息進(jìn)行處理,如下圖:
這里記住:Android里并沒有Global的Message Queue數(shù)據(jù)結(jié)構(gòu),例如,不同APK里的對象不能透過Massage Queue來交換訊息(Message)。例如:線程A的Handler對象可以傳遞消息給別的線程,讓別的線程B或C等能送消息來給線程A(存于A的Message Queue里)。線程A的Message Queue里的訊息,只有線程A所屬的對象可以處理。
案例分析:
經(jīng)典的歌詞同步,這時我們不僅要聽到優(yōu)質(zhì)的歌曲,還要可以有歌詞同步,這時另開一條線程來處理歌詞的同步是比較好的解決辦法,你可以根據(jù)自己的定義,抓取歌曲的duration 在線程中處理歌詞的前進(jìn)或者后退。。。
Demo 分析:
下面我們來實(shí)現(xiàn)一個Iphone 上的一個通過按數(shù)字后,數(shù)字過多消除的按鈕事件。事件的原理如下,事件要的效果是這樣的,當(dāng)長按消除按鈕后,數(shù)字會慢慢消除,過會消除速度會增快,那么實(shí)現(xiàn)這個效果我們就需要自己做一個小鍵盤,我做的鍵盤效果如下:
我們通過點(diǎn)擊 來達(dá)到這個效果,使用的是android 的線程機(jī)制。實(shí)現(xiàn)代碼如下:
private Thread thread;
private TextView tv_call_no;
protected static Runnable Runablerun = null;
private Handler handler;
private int textLength = 0;
private boolean isStop = true;
首先將要使用的數(shù)據(jù)類型聲明在頭部,將會使用到 java 的 Thread 和Android Handler 對象,首先實(shí)現(xiàn)Runable 對象,代碼如下:
Runablerun = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
int i = 0;
do {
i++;
Thread.sleep(i > 15 ? 20 : 100);
Message msg = handler.obtainMessage();
msg.arg1 = i;
msg.sendToTarget();
if (i == textLength) {
isStop = false;
}
} while (isStop);
} catch (Exception e) {
// TODO: handle exception
}
}
};
上面代碼還可以如此寫法:
Message msg=new Message();
msg.arg1=i;
handler.sendMessage(msg);
第一種寫法是message 從handler 類獲取,從而可以直接向該handler 對象發(fā)送消息,第二種寫法是直接調(diào)用 handler 的發(fā)送消息方法發(fā)送消息。不過不管是第一種方法好還是第二種方法好,都要在同樣的handler 接收消息,否則會報異常。下面實(shí)現(xiàn)handler 對象,代碼如下:
/**
* 啟動線程
*
* @param tv
* @param text
* @return
*/
public Handler getHandler(final TextView tv, final String text) {
Handler hand = new Handler() {
public void handleMessage(Message msg) {
tv.setText(text.substring(0, text.length() - msg.arg1));
super.handleMessage(msg);
};
};
return hand;
}
這里返回一個handler 對象,實(shí)際上是返回去給上面我們的handler 對象使用,這里我把它封裝成一個方法,可以讓它在每次接收到消息后去使用消息處理文本每次減1
設(shè)置的 onTouch 事件,使其在彈出時停止遞減:
/**
* 點(diǎn)擊back刪除之前的數(shù)據(jù),跳出就停止刪除
*/
OnTouchListener ontouch = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
String text = tv_call_no.getText().toString();
if (text.length() == 0) {
isStop = false;
return false;
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
isStop = true;
textLength = tv_call_no.getText().length();
handler = getHandler(tv_call_no, text);
thread = new Thread(Runablerun);
thread.start();
break;
case MotionEvent.ACTION_UP:
isStop = false;
break;
}
return false;
}
};
小結(jié):
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載