日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

java 线程间通信 handler_Handler不同线程间的通信

發(fā)布時(shí)間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 线程间通信 handler_Handler不同线程间的通信 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)http://www.iteye.com/problems/69457

Activity啟動(dòng)后點(diǎn)擊一個(gè)界面按鈕后會(huì)開(kāi)啟一個(gè)服務(wù)(暫定為padService),在padService中會(huì)啟動(dòng)一個(gè)線程(暫定為T(mén)hread-3)發(fā)起Socket連接。我們項(xiàng)目中使用mina作為socket通信框架,用過(guò)mina的同志們應(yīng)該熟悉,Thread-3只是負(fù)責(zé)監(jiān)聽(tīng),具體的消息處理是另外的線程。在我們的IoHandler中處理消息,現(xiàn)在的問(wèn)題是,我需要在IoHander的sessionOpened方法中給Activity一個(gè)消息去更新UI界面,這個(gè)就涉及到不同線程間的通信了。

網(wǎng)上搜索后,在android中線程間通信使用Handler,Looper,Message這幾個(gè)對(duì)象(不熟悉這些概念的同志們請(qǐng)自己查下)。

這是網(wǎng)上的一個(gè)使用例子:

Java代碼

publicclassActivity2?extendsActivity?implementsOnClickListener{

Button?button?=?null;

TextView?text?=?null;

MyHandler?mHandler?=?null;

Thread?thread?;

@Override

protectedvoidonCreate(Bundle?savedInstanceState)?{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity1);

button?=?(Button)findViewById(R.id.btn);

button.setOnClickListener(this);

text?=?(TextView)findViewById(R.id.content);

}

publicvoidonClick(View?v)?{

switch(v.getId())?{

caseR.id.btn:

thread?=?newMyThread();

thread.start();

break;

}

}

privateclassMyHandler?extendsHandler{

publicMyHandler(Looper?looper){

super(looper);

}

@Override

publicvoidhandleMessage(Message?msg)?{//處理消息

text.setText(msg.obj.toString());

}

}

privateclassMyThread?extendsThread{

@Override

publicvoidrun()?{

Looper?curLooper?=?Looper.myLooper();

Looper?mainLooper?=?Looper.getMainLooper();

String?msg?;

if(curLooper==null){

mHandler?=?newMyHandler(mainLooper);

msg?=?"curLooper?is?null";

}else{

mHandler?=?newMyHandler(curLooper);

msg?=?"This?is?curLooper";

}

mHandler.removeMessages(0);

Message?m?=?mHandler.obtainMessage(1,?1,?1,?msg);

mHandler.sendMessage(m);

}

}

}

這個(gè)沒(méi)有問(wèn)題,基本上三個(gè)對(duì)象的使用也很清楚,myHandler雖然是由子線程new出來(lái)的,但主線程持有引用,在我們的項(xiàng)目中不能用,因?yàn)槲覀儙讉€(gè)線程屬于不同的類(lèi),我嘗試用下面的方法解決:

在IoHandler中new一個(gè)android的handler,參數(shù)為主線程的Looper:

Java代碼

newHandler(Looper.getMainLooper()).sendMessage(msg);

IoHandler所在的線程給主線程發(fā)送消息(looper是主線程的,消息也就放在主線程的消息隊(duì)列里了)

但是在主線程的handleMessage方法中得不到消息,嘗試失敗。

那么怎么辦呢,讓IoHandler持有主線程的handler引用,具體做法有兩種方式:

1. ?參數(shù)傳遞,把主線程的handler通過(guò)參數(shù)傳遞的形式傳到IoHandler中。

2. 靜態(tài)變量,把主線程的handler申明為公共靜態(tài)變量

Java代碼

publicstaticHandler?mainHandler;

這樣在Iohandler中使用

Java代碼

welcomeActivity.mainHandler.sendMessage(msg);

這兩種方式在主線程的? handleMessage的方法中都可以得到IoHandler發(fā)送的消息。

本人使用的是靜態(tài)變量解決的,因?yàn)橛泻脦讉€(gè)來(lái)實(shí)現(xiàn)通信,參數(shù)傳遞太麻煩。

那為什么我的第一種嘗試是失敗的呢,我是把消息放到主線程的消息隊(duì)列了啊,這就要看android的一些實(shí)現(xiàn)機(jī)制了。

通過(guò)網(wǎng)絡(luò)和android的api,本人的理解如下:

Looper是MessageQueue和Handler溝通的橋梁,Handler通過(guò)Looper把消息放入消息隊(duì)列(MessageQueue),你想把消息發(fā)給誰(shuí),就把誰(shuí)的looper作為參數(shù)傳給Handler

Java代碼

newHandler(Looper?looper);

Looper把消息放入消息隊(duì)列,并廣播消息,這個(gè)不太好理解,我舉例如下:

主線程的Handler我們這樣定義:Handler mainHandler = new Handler(); ?如果Handler沒(méi)有參數(shù),默認(rèn)為當(dāng)前線程的Looper

子線程的Handler我們這樣定義: Handler subHandler = newHandler(Looper.getMainLooper()); 參數(shù)為主線程的Looper

這樣兩個(gè)線程都會(huì)把消息放入主線程的消息隊(duì)列里了。

現(xiàn)在mainHandler.sendMessage(), 消息進(jìn)入主線程的消息隊(duì)列,Looper廣播消息,其實(shí)就是調(diào)用mainHandler的dispatchMessage方法,所有持有mianHandler引用的類(lèi)都可以收到消息,注意啊,現(xiàn)在subHandler并不能接受到消息,因?yàn)長(zhǎng)ooper并沒(méi)有調(diào)用subHandler的dispatchMessage方法,所以應(yīng)該這樣理解廣播,A發(fā)送消息,那么A的Looper就調(diào)用A的dispatchMessage方法,別的B,C, D雖然也是A的Looper,但沒(méi)有A的引用,所以B,C,D是接受不到消息的,如果B, C,D持有A的引用,但B,C,D不用A的Looper,那么也是接受不到消息的。這點(diǎn)在開(kāi)發(fā)時(shí)要特別注意。

以上是我在使用Looper, Handler ,Message中的一些問(wèn)題,可能有理解錯(cuò)的地方,請(qǐng)大大們指出來(lái)。

我的疑惑是難道子線程必須持有主線程的引用才可以給主線程發(fā)送消息嗎?要知道我們的子線程并不一定和主線程一個(gè)類(lèi),可能在別的類(lèi)中,這個(gè)引用傳遞實(shí)在太麻煩了,期望有更好的解決方式。

總結(jié)

以上是生活随笔為你收集整理的java 线程间通信 handler_Handler不同线程间的通信的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。