国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
圖解 Android Handler 線程消息機(jī)制 - Terry_龍 - 51CTO技術(shù)...

從現(xiàn)實(shí)生活中理解線程消息機(jī)制

android 有一種叫消息隊(duì)列的說法,這里我們可以這樣理解:假如一個隧道就是一個消息隊(duì)列,那么里面的每一部汽車就是一個一個消息,這里我們先忽略掉超車等種種因素,只那么先進(jìn)隧道的車將會先出,這個機(jī)制跟我們android 的消息機(jī)制是一樣的。

Android 的線程消息機(jī)制

android 在設(shè)計(jì)的時候引入了 wince 的消息機(jī)制,即將每一個消息發(fā)送到隊(duì)列里面,遵循先進(jìn)先出原則。發(fā)送消息并不會阻塞線程,而接收線程會阻塞線程,這是因?yàn)?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 接收消息,否則會報(bào)異常。下面實(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é):

  • 1、向哪個Handler 發(fā)送消息,就必須在哪個handler 里面接收;
  • 2、直接使用JAVA 的 Thread 是無法更新Android UI的,因?yàn)锳ndroid View 在設(shè)計(jì)的時線程是不完全的,不過Android 提供了幾種供開發(fā)者在線程中更新UI的方法,如下:
    • Activity.runOnUiThread( Runnable )
    • View.post( Runnable )
    • View.postDelayed( Runnable, long )
    • Hanlder
  • 3、直接使用hanlder .post 等方法是在當(dāng)前主線程里面做操作,而不是另外新建線程,建議使用Thread 線程直接新建另外一個線程或者使用HandlerThread類也可以。
  • 4、記住消息隊(duì)列的先進(jìn)先出原則。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
【轉(zhuǎn)】解析Android消息處理機(jī)制
Android中的Handler的機(jī)制與用法詳解
Android開發(fā)之異步詳解(一)Thread+Handler
Android中的Handler機(jī)制
Android全面解析之由淺及深Handler消息機(jī)制
Android中Handler的機(jī)制
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服