欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

活用Android的Message Queue(2)

系統(tǒng) 1912 0

1. ??????? 復(fù)習(xí) Message Queue 的角色

在上一篇里,介紹了 Android Thread Looper Message Queue Handler 四者間之關(guān)系。

先復(fù)習(xí)如下:

l ??? UI thread? 通常就是 main thread ,而 Android 啟動(dòng)程序時(shí) ( 即創(chuàng)建 Process 時(shí) ) 會(huì)替它建立一個(gè) Message Queue

l ??? 當(dāng)然需要一個(gè) Looper 對(duì)象,來(lái)管理該 Message Queue

l ??? 我們可以創(chuàng)建 Handler 對(duì)象來(lái) push 新消息到 Message Queue 里;或者接收 Looper( Message Queue 取出 ) 所送來(lái)的消息。

l ??? 線程 A Handler 對(duì)象引用可以傳遞給別的線程,讓別的線程 B C 等能發(fā)送消息來(lái)給線程 A( 存于 A Message Queue )

l ??? 線程 A Message Queue 里的消息,只有線程 A 所屬的對(duì)象可以處理之

?

? 了解了四者間之關(guān)系后,在本篇里,就能來(lái)思考如何讓主線程與子線程之間互相溝通了。包括, 子線程 push 消息到主線程的 Message Queue 里,并觸發(fā)主線程去執(zhí)行某項(xiàng)工作 ( 即執(zhí)行某個(gè)函數(shù) )

?

2.?? 由別的線程發(fā)送消息到主線程的 Message Queue( 續(xù) )

??? ? 在上一篇文章里,使用如下程序片段:

// ? class ?ac01? extends ?Activity {

??????????// ………

?????????????? public ? void ?onClick(View v) {

????????????????????? switch (v.getId()){

????????????????????? case ?101:

??????????????????????????? t ?=? new ?myThread();

??????????????????????????? t .start();

?????????????????????????? break ;

????????????????????? case ?102:

??????????????????finish();

???????????????????????????????? break ;

?????????????????????}

???????????}

//------------------------------------------------------?????????????

class ?EHandler? extends ?Handler {

??????????????????? public ?EHandler(Looper looper) {

??????????????????????? super (looper);

???????????????????}

??????????????????? @Override

??????????????????? public ? void ?handleMessage(Message msg) {

?????????????????????? tv .setText((String)msg. obj );

???????????????}

???????????}

//------------------------------------------------------?????????????

class ?myThread? extends ?Thread{

???????????? private ?EHandler? mHandler ;

???????????? public ? void ?run() {

????????????????Looper myLooper, mainLooper;

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

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

????????????????String obj;

???????????????? if (myLooper ==? null ){

??????????????????????? mHandler ?=? new ?EHandler(mainLooper);

???????????????????????obj =? "current thread has no looper!" ;

????????????????}

???????????????? else ?{

????????????????????? mHandler ?=? new ?EHandler(myLooper);

?????????????????????obj =? "This is from current thread." ;

????????????????}

???????????????? mHandler .removeMessages(0);

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

???????????????? mHandler .sendMessage(m);

?????????????}

??}

}

??

這個(gè) mHandler 定義于 myThread 類(lèi)別里,而且由子線程執(zhí)行指令: ?????? mHandler ?=? new ?EHandler(mainLooper);

來(lái)創(chuàng)建 EHandler 對(duì)象;但是這個(gè) mHandler 確是屬于 main 線程的 ( 用來(lái)存取主線程的 MessageQueue) ,所以指令:

mHandler .sendMessage(m); 是將 m 丟到主線程的 MessageQueue 里。

此外,我們也可以將 mHandler 定義于 ac01 類(lèi)別里。如下程序范例:

?

//----- Looper_03 范例 ?-----

public ? class ?ac01? extends ?Activity? implements ?OnClickListener {

???? private ? final ? int ? WC ?= LinearLayout.LayoutParams. WRAP_CONTENT ;

???? private ? final ? int ? FP ?= LinearLayout.LayoutParams. FILL_PARENT ;

???? public ?TextView? tv ;

???? private ?myThread? t ;

???? private ?Button? btn ,? btn2 ;

????EventHandler? h ;

????Context? ctx ;

???? public ? void ?onCreate(Bundle icicle) {

???????????? super .onCreate(icicle);

???????????? ctx ?=? this ;

????????????????LinearLayout layout =? new ?LinearLayout( this );

????????????????layout.setOrientation(LinearLayout. VERTICAL );

??????????????????????????????

???????????????? btn ?=? new ?Button( this );

???????????????? btn .setId(101);

???????????????? btn .setBackgroundResource(R.drawable. heart );

???????????????? btn .setText( "test looper" );

???????????????? btn .setOnClickListener( this );

????????????????LinearLayout.LayoutParams param =

???????????????????? new ?LinearLayout.LayoutParams(100,50);

????????????????param. topMargin ?= 10;

????????????????layout.addView( btn , param);

???????????????

???????????????? btn2 ?=? new ?Button( this );

???????????????? btn2 .setId(102);

???????????????? btn2 .setBackgroundResource(R.drawable. ok_blue );

???????????????? btn2 .setText( "exit" );

???????????????? btn2 .setOnClickListener( this );

????????????????layout.addView( btn2 , param);

???????????????

???????????????? tv ?=? new ?TextView( this );

???????????????? tv .setTextColor(Color. WHITE );

???????????????? tv .setText( "" );

????????????????LinearLayout.LayoutParams param2 =

??????????????????? new ?LinearLayout.LayoutParams( FP ,? WC );

????????????????param2. topMargin ?= 10;

????????????????layout.addView( tv , param2);

????????????????setContentView(layout);?????

???????????????}

?????????? public ? void ?onClick(View v) {

???????? switch (v.getId()){

???????? case ?101:

????????????? h ?=? new ?EventHandler(Looper. myLooper ());

????????????? t ?=? new ?myThread();

????????????? t .start();

????????????? break ;

???????? case ?102:

???????finish();

???????????? break ;

????????}

????}

//------------------------------------------------?????

public ? class ?EventHandler? extends ?Handler {

???????????? public ?EventHandler(Looper looper) {

????????????????? super (looper);

?????????????}

????????????? @Override

????????????? public ? void ?handleMessage(Message msg) {

??????????????????????((Activity) ctx ).setTitle((String)msg. obj );

?????????????}

??????????}

//------------------------------------------------------??????

class ?myThread? extends ?Thread{

????? public ? void ?run() {

????????????String obj =? "from myThread" ;

????????????Message m =? h .obtainMessage(1, 1, 1, obj);

???????????? h .sendMessage(m);

??????}

??}

}

//------------------------------------------------------

?

指令: h ?=? new ?EventHandler(Looper. myLooper ());

h 是屬于 main 線程的 ( 用來(lái)存取主線程的 MessageQueue) 。在 myThread 類(lèi)別里的指令: h .sendMessage(m);

雖然是由子線程執(zhí)行該指令,還是將 m 丟到主線程的 MessageQueue 里。于是,子線程所執(zhí)行的 run() 函數(shù),就順利將 m 丟給主線程 ( Message Queue) ,并觸發(fā)了主線程去執(zhí)行 handleMessage() 函數(shù)了。顯示出畫(huà)面如下:

?

?

? 1??

?

上述的指令:

?

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

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

????????????????………

?????????? mHandler ?=? new ?EHandler(mainLooper);

??????????????????………

?????????? mHandler ?=? new ?EHandler(myLooper);

????????????????????………

?

明顯地指明 mHandler 是負(fù)責(zé)存取哪一個(gè)線程的 Message Queue 。不過(guò),有時(shí)候并不需要特別指明。例如上述的 onClick() 函數(shù)和 EventHandler 類(lèi)別,可改寫(xiě)為:

?

//----- Looper_03aa? 范例 ?-----

// ? class ?ac01? extends ?Activity {

??????????// ………

??????? public ? void ?onClick(View v) {

???????? switch (v.getId()){

???????? case ?101:

????????????? h ?=? new ?EventHandler();

????????????? t ?=? new ?myThread();

????????????? t .start();

????????????? break ;

???????? case ?102:

??????????????finish();

???????????? break ;

????????}

????}

//------------------------------------------------?????

public ? class ?EventHandler? extends ?Handler {

????????????? @Override

????????????? public ? void ?handleMessage(Message msg) {

??????????????????????((Activity) ctx ).setTitle((String)msg. obj );

?????????????}

??????????}

//------------------------------------------------------??????

class ?myThread? extends ?Thread{

????? public ? void ?run() {

????????????String obj =? "from myThread" ;

????????????Message m =? h .obtainMessage(1, 1, 1, obj);

???????????? h .sendMessage(m);

??????}

??}

}

?

指令: h ?=? new ?EventHandler();? 就等于: h = new EventHandler(Looper.myLooper());

它建立了當(dāng)前線程 (Current Thread) EventHandler 對(duì)象。于此,是由 main 線程執(zhí)行此指令的,所以此 EventHandler 對(duì)象是用來(lái)存取 main 線程的 Message Queue

上述程序?qū)? handleMessage() 定義于 EventHandler 類(lèi)別內(nèi),也可以直接定義于 ac01 類(lèi)別之內(nèi)。于是上述程序,也相當(dāng)于:

?

//----- Looper_03bb? 范例 ?-----

// ? class ?ac01? extends ?Activity {

??????????// ………

?????????? public ? void ?onClick(View v) {

???????? switch (v.getId()){

???????? case ?101:

????????????? h ?=? new ?Handler(){

????????????????? public ? void ?handleMessage(Message msg) {

??????????????????????((Activity) ctx ).setTitle((String)msg. obj );

?????????????}};

?????????????? t ?=? new ?myThread();

????????????? t .start();

????????????? break ;

???????? case ?102:

????????finish();

???????????? break ;

????????}

????}

//------------------------------------------------------??????

class ?myThread? extends ?Thread{

????? public ? void ?run() {

????????????String obj =? "from myThread..." ;

????????????Message m =? h .obtainMessage(1, 1, 1, obj);

???????????? h .sendMessage(m);

??????}

??}

}

?

其執(zhí)行結(jié)果是一樣的。

?

轉(zhuǎn)自: http://www.android1.net/Topic.aspx?BoardID=11&TopicID=631

活用Android的Message Queue(2)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 色婷婷久久久久swag精品 | 日本一区二区三区四区在线观看 | 久久这里只有精品国产99 | 色婷婷色综合激情国产日韩 | 国产综合亚洲精品一区二 | 色呦呦在线免费观看 | 免费中文字幕 | 超97在线观看精品国产 | 亚洲欧美在线视频 | 91精品国产91久久久久久 | 欧美成人免费毛片 | 中文字幕在线精品 | 日韩欧美在线一区 | 在线观看成人 | chinese 军人 gay xx 呻吟 | 国产目拍亚洲精品99久久精品 | 国产精品尤物在线观看一区 | 中文字幕一区二区三区四区五区 | 久久久久久国产精品免费免费狐狸 | 三级黄色片在线观看 | 青草福利 | www.狠狠艹 | 91精品国产闺蜜国产在线 | 自拍视频在线观看 | 婷婷色婷婷 | 一级一片免费看 | 操夜夜| 天天噜噜揉揉狠狠夜夜 | 一区二区三区在线观看免费 | 亚洲国产三级 | 久久精精| 国产成人理在线观看视频 | 日韩精品真人荷官无码 | 欧美日韩国产综合网 | 国产美女福利视频福利 | 久久精品视频16 | 九九精品久久 | 九九热在线视频免费观看 | 亚洲成人精品在线 | 奇米88 | 国产精品自拍在线观看 |