3.?? 由主線程發(fā)送消息給子線程 ( 續(xù) )
???? 上述范例里,是由子線程發(fā)送消息給主線程。本節(jié)將介紹如何從主線程 發(fā)送消息 給子線程。其方法是:當(dāng)子線程執(zhí)行 run() 函數(shù)時,就創(chuàng)建一個子線程的 Handler 對象。之后,當(dāng)主線程執(zhí)行 ac01 的 onClick() 函數(shù)時,就藉由此 Handler 對象引用而 push 消息給子線程。例如下述范例:
?
//----- Looper_04 范例 ?-----
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 ;
???? private ?Handler? h ;
???? private ?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);?
???????????????? //------------------------
???????????????? t ?=? new ?myThread();
????????????????? t .start();
??????????}
?????????? public ? void ?onClick(View v) {
???????? switch (v.getId()){
???????? case ?101:
?????????????String obj =? "mainThread" ;
?????????????Message m =? h .obtainMessage(1, 1, 1, obj);
????????????? h .sendMessage(m);
????????????? break ;
???????? case ?102:
???????????? h .getLooper().quit();
????????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() {
?????????Looper. prepare ();
????????? h ?=? new ?Handler(){
??????????????? public ? void ?handleMessage(Message msg) {
??????????????????EventHandler ha =? new
?????????????????????EventHandler(Looper. getMainLooper ());
????????????????????String obj = (String)msg. obj ?+? ", myThread" ;
?????????????????????Message m = ha.obtainMessage(1, 1, 1, obj);
?????????????????????ha.sendMessage(m);
?????????}
?????????};
?????????Looper. loop ();
??????}
??}
}
?
?
當(dāng)子線程執(zhí)行 run() 函數(shù)時,創(chuàng)建一個主線程的 EventHandler 對象,并且藉之而 push 消息給主線程了。就進(jìn)行了兩個線程之間的互相交換消息,也是兩個函數(shù)或?qū)ο箝g之交換消息。此程序輸出畫面為:
?
圖 2
?
????? 上述范例定義了 Thread 的子類別。也可以將子線程包含到 Runnable 類別里,如下:
?
//----- Looper_04aa 范例 ?-----
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 ?RR? r ;
???? private ?Button? btn ,? btn2 ;
???? private ?Handler? h ;
???? private ?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);?
???????????????? //------------------------
???????????????? r ?=? new ?RR();
?????????}
?????????? public ? void ?onClick(View v) {
???????? switch (v.getId()){
???????? case ?101:
?????????????String obj =? "mainThread" ;
?????????????Message m =? h .obtainMessage(1, 1, 1, obj);
????????????? h .sendMessage(m);
????????????? break ;
???????? case ?102:
???????????? h .getLooper().quit();
????????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 );
????????????}
????????}
//------------------------------------------------?????
public ? class ?RR? implements ?Runnable {
???? public ?RR() {
????????Thread aThread =? new ?Thread( null ,? this ,? "RR" );
????????aThread.start();
????}
???? public ? void ?run() {
?????????Looper. prepare ();
????????? h ?=? new ?Handler(){
??????????????? public ? void ?handleMessage(Message msg) {
??????????????????EventHandler ha =? new ?EventHandler(Looper. getMainLooper ());
????????????????????String obj = (String)msg. obj ?+? ", myThread" ;
?????????????????????Message m = ha.obtainMessage(1, 1, 1, obj);
?????????????????????ha.sendMessage(m);
?????????}
?????????};
?????????Looper. loop ();
??????}
??}
}
?
?
當(dāng)子線程執(zhí)行到 RR() 函數(shù)時,創(chuàng)建一個子線程,并執(zhí)行 run() 函數(shù),就將 消息發(fā)送 給主線程了。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
