1. 程式人生 > >HandlerThread,Handler,Thread使用方法

HandlerThread,Handler,Thread使用方法

Handler會關聯一個單獨的執行緒和訊息佇列。Handler預設關聯主執行緒,雖然要提供Runnable引數 ,但預設是直接呼叫Runnable中的run()方法。也就是預設下會在主執行緒執行,如果在這裡面的操作會有阻塞,介面也會卡住。如果要在其他執行緒執行,可以使用HandlerThread。

HandlerThread繼承於Thread,所以它本質就是個Thread。與普通Thread的差別就在於,主要的作用是建立了一個執行緒,並且創立了訊息佇列,有來自己的looper,可以讓我們在自己的執行緒中分發和處理訊息。

HandlerThread的使用  

//Handler handler = new Handler() {

//...
//}
HandlerThread uIhandlerThread = new HandlerThread("update");
uIhandlerThread.start();
//Handler UIhandler = new Handler(uIhandlerThread.getLooper());
Handler uIhandler = new Handler(uIhandlerThread.getLooper(),new Callback() {
public boolean handleMessage(Message msg) {
Bundle b = msg.getData();
int age = b.getInt("age");

String name = b.getString("name");
System.out.println("age is " + age + ", name is" + name);
System.out.println("Handler--->" + Thread.currentThread().getId());
System.out.println("handlerMessage");
return true;
}
});


當要停止uIhandlerThread執行時用:
if(uIhandlerThread!=null) {
pointThread.quit();
}

Handler的使用
目前常使用的有兩種用法,

一種是自定義Handler,在handleMessage進行事件的處理, 這個Message可以是在其他執行緒中send的,或者在主執行緒中send。
線上程中傳送資訊到主程序:
1.定義handler

public class MyHandler extends Handler {
@Override
public boolean handleMessage(Message msg) {
switch (msg.what){
case 1 :
....
}
}
}
MyHandler myHandler = new MyHandler();


或者

Handler myHandler = new Handler(new Callback(){
// 引數也可以為(this.getMainLooper(),new Callback(){})不寫則預設為主程序的Looper
@Override
public boolean handleMessage(Message msg) {
// TODO Auto-generated method stub
return false;
}
});


2.新建一個執行緒

Thread sender = new Thread(){
@Override
public void run() {
....
myHandler.obtainMessage( inWhat , inA , inB , inToken );
myHandler.sendMessage( inMessage );
//myHandler.sendEmptyMessage( inWhat );
}
}
sender.start();


在主執行緒中發信息到handler
直接在主程序,不線上程中mHandler.sendMessage( inMessage );
另一種為post一個執行緒進去,執行執行緒。直到執行緒退出或者是handler被removeCallbacks。
定義一個執行緒Tread名為sender(不重複了)。
然後執行,myHandler.post(sender);
這樣執行緒就在handler中執行。如果要停止執行緒的話:
if(myHandler!=null) {
myHandler.removeCallbacks(senderObj);
}

也可用一個Runnable來代替Thread

Runnable r = new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub

}

};
myHandler.post(r);


以上兩種,是否使用handler的post來啟動,差別在與是否開啟新執行緒來執行處理。使用post方法時,直接呼叫Thread或Runnable的run方法,所有處理都在主執行緒中進行,並沒有開啟定義的Thread或Runnable新的執行緒!!

==============================================================================================
關於Thread和Runnable的區別
參考網址:http://www.360doc.com/content/10/1219/22/573136_79607619.shtml
Thread和Runnable是實現java多執行緒的兩種方式,Thread是類,Runnable為介面,建議使用Runnable來實現多執行緒。
如果讓一個執行緒實現Runnable介面,那麼當呼叫這個執行緒的物件開啟多個執行緒時,可以讓這些執行緒呼叫同一個變數;
若這個執行緒是由繼承Thread類而來,則要通過內部類來實現上述的功能,利用的就是內部類可任意訪問外部類變數這個特性。(精闢!!)
例子程式:

public class ThreadTest
{
public static void main(String[] args)
{
MyThread mt=new MyThread();
new Thread(mt).start(); //通過實現Runnable的類的物件來開闢第一個執行緒
new Thread(mt).start(); //通過實現Runnable的類的物件來開闢第二個執行緒
new Thread(mt).start(); //通過實現Runnable的類的物件來開闢第三個執行緒
//由於這三個執行緒是通過同一個物件mt開闢的,所以run()裡方法訪問的是同一個index
}
}


class MyThread implements Runnable //實現Runnable介面
{
int index=0;
public void run()
{
for(;index<=200;)
System.out.println(Thread.currentThread().getName()+":"+index++);
}
}


------------------------------------------------------

public class ThreadTest
{
public static void main(String[] args)
{
MyThread mt=new MyThread();
mt.getThread().start(); //通過返回內部類的物件來開闢第一個執行緒
mt.getThread().start(); //通過返回內部類的物件來開闢第二個執行緒
mt.getThread().start(); //通過返回內部類的物件來開闢第三個執行緒
//由於這三個執行緒是通過同一個匿名物件來開闢的,所以run()裡方法訪問的是同一個index
}
}


class MyThread
{
int index=0;
private class InnerClass extends Thread //定義一個內部類,繼承Thread
{
public void run()
{
for(;index<=200;)
System.out.println(getName()+":"+index++);
}
}
Thread getThread() //這個函式的作用是返回InnerClass的一個匿名物件
{
return new InnerClass();
}
}
// 這裡有一個問題:如果內部類要訪問一個外部變數或方法,那麼這個變數或方法必須定義為final,但為什麼這裡的變數index不用定義為final就可以被內部類訪問?


=============================================================================================
Thread的使用
執行緒的定義於執行

Thread sender = new Thread(){
@Override
public void run() {
....
}
}
sender.start();


執行緒的停止
if (sender != null) {
//sender.quit();
sender.join(); // 執行完畢當前處理後停止執行緒
}

相關推薦

HandlerThreadHandlerThread使用方法

Handler會關聯一個單獨的執行緒和訊息佇列。Handler預設關聯主執行緒,雖然要提供Runnable引數 ,但預設是直接呼叫Runnable中的run()方法。也就是預設下會在主執行緒執行,如果在這裡面的操作會有阻塞,介面也會卡住。如果要在其他執行緒執行,可以使用H

kotlin安卓開發:fragment向activity傳遞資料通過handler設定回撥方法

從activity向fragment傳遞就比較方便了,直接用: fg.arguments = arguments 現在看看怎麼從fragment向activity傳遞資料。 比如說,我們在一個ViewPage裡面設定了若干個fragment,fragment裡面有一個按鈕,提交相關

Android的訊息機制用Android執行緒間通訊的Message機制Android中Handler的使用方法

轉自:http://www.cnblogs.com/-OYK/archive/2011/08/03/2126657.html Android的訊息機制(一)   android 有一種叫訊息佇列的說法,這裡我們可以這樣理解:假如一個隧道就是一個訊息佇列,那麼裡

多執行緒實現方式1:自定義一個類繼承Thread並重寫run方法

/** * 多執行緒實現方式1: * 自定義一個類,繼承Thread類,並重寫run方法。 * 執行緒同時執行。 * @author jiaxutianhuo * */ public cl

Android通訊模組(單執行緒多執行緒通訊方式Handler 與UI Thread的互動Handler接合子執行緒的使用)

一丶概述 本週的學習計劃是Android通訊模組,內容:單執行緒,多執行緒通訊方式,Handler 與UI Thread的互動,Handler接合子執行緒的使用。 二丶效果演示(原始碼連結見文末) 三丶實現功能 1.演示使用Handler常見崩潰 2.handler更新

java thread的stopsuspendresume等方法廢棄的原因

如下是官方文件,先貼上,抽時間翻譯 Why Are Thread.stop, Thread.suspend, Thread.resume and Runtime.runFinalizersOnExit Deprecated? Why is Thread.stop

創建線程時如果既傳入了runnable對象又繼承thread重寫了run方法會執行的哪裏的代碼

繼承 ide get color ride .get print override new 1 使用線程的方式,繼承thread類,重寫run方法 new Thread() { @Override

面經手冊 · 第20篇《Thread 執行緒狀態轉換、方法使用、原理分析》

![](https://img-blog.csdnimg.cn/2020120309281124.png) 作者:小傅哥 部落格:[https://bugstack.cn](https://bugstack.cn) Github:[https://github.com/fuzhengwei/CodeGuide

css浮動布局浮動原理清除(閉合)浮動方法

alt 容器 images 進行 type -s ext 浮動框 形象 css浮動 1.什麽是浮動:在我們布局的時用到的一種技術,能夠方便我們進行布局,通過讓元素浮動,我們可以使元素在水平上左右移動,再通過margin屬性調整位置 2.浮動的原理:使當前元素脫離普通流,相當

kindeditor官網異步加載示例無效解決無法通過方法初始化編輯器

har cdd kxml yep adf tr1 ket 沒有效果 iba 官網示例:http://kindeditor.net/ke4/examples/dynamic-load.html 項目中發現一個問題,kindeditor官網是通過 初始化編輯器,但是現在有

聯想的S415電腦Debian8.8開機後亮度值始終最大嘗試過各種方法始終無法解決最後安裝開源驅動後成功

firmware 保存 ces fst pack 聯系 輸入 aptitude reboot 安裝ATI顯卡驅動(開源)(方法步驟來自Debian WiKi) A.先升級可用的包 # aptitude upgrade B.安裝下面3個包 # apt-get i

關於物體 '固有類別' 與 '實際使用類別' 分離的情況結構體定義方法

con 以及 truct 工作量 cpp rouge int 減少 不同 在面向接口、面向對象編程的過程中,會遇到實際物體類別與定義類別相分離的情況。 例如,我們有三種物體,他們的固有類別分別為: TYPEA,TYPEB,TYPEC。在我們實際使用過程中,我們會根據不同的情

每天一個JS 小demo之原生數組splice方法書寫。主要知識點:鍛煉思維邏輯能力對於數組方法的理解和各種情況的考量

scrip charset 是否 isn 如果 情況 del 當前 cti <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <titl

php類中的$thisstaticconstself這幾個關鍵字使用方法

ons all 丟失 static ret 方法名 style sin 靜態方法 本篇文章主要分享一下關於php類中的$this,static,final,const,self這幾個關鍵字使用方法 $this $this表示當前實例,在類的內部方法訪問未聲明為const及s

javascript 對象屬性的添加刪除json對象和字符串轉換方法

star font style strong 字符串轉換 定義 obj tarray def 1:動態添加 對象屬性 var obj = new Object(); console.log (obj.username); obj.username = "haha"; con

jsvue.js一些方法的總結

nbsp 進行 for submit 多個 targe tag spl 修飾 push() 可向數組的末尾添加一個或多個元素 pop() 刪除並返回數組的最後一個元素 shift()刪除並返回數組的第一個元素 unshift() 添加並返回數組的第一個元素 sort()對數

Linux下進行硬盤掛載、分區、刪除分區格式化掛載卸載方法

硬盤 訪問 9.png dir 輸入 str 創建 指定 命令 本文簡單介紹了下文件系統及其操作(df命令),磁盤分區、格式化,還有最主要是掛載操作。 在這裏對“掛載”做個說明,我們都知道文件系統是創建在磁盤上面的,每個文件系統都有獨立的inode、block等信息,而這

js中常用追加元素的幾種方法:appendappendToafterbeforeinsertAfterinsertBeforeappendChild

pre gre con 常用 align lin width insert rip js中常用追加元素的幾種方法,點擊下面每個按鈕,即可查看效果 我是第一個子元素 我是第二個子元素 append appendTo prepend prependTo a

cocos2d-html5 javascript 通過C++綁定調用java方法

setprop 綁定 gin call news .cpp argc clas end 1、java中的寫法 /* * XConnectPlugin.java * * Created on: 2014年4月30日 * Author: [em

Android開發學習之路--異步消息HandlerMessageLooper和AsyncTask之初體驗

被調用 project 輸入 gettext npos article app sso 音樂播放 在簡易音樂播放器中。用了Handler。也沒有過多地去研究學習,這裏再學習下android下的異步消息處理機制。這裏用了Handler主要是在線程中不能更新UI