当前位置:操作系统 > 安卓/Android >>

Android 主线程和线程之间相互发送消息

通过分析Activity源码,我们知道每个Activity都有一个Looper,所以主线程在接收Message是不需要调用Looper.prepare()和Looper.loop(),但是线程是不带Looper的,当线程要接收来自主线程的消息是就需要调用Looper.prepare()和Looper.loop()。以下我们将通过一个示例,讲述主线程和线程之间如何发送Message。
 

01 import android.app.Activity;

02 import android.os.Bundle;

03 import android.os.Handler;

04 import android.os.Message;

05 import android.widget.Toast;

06  

07 /**

08  * 这个类是主线程,它每隔两秒就发送一个Message给线程,线程收到Message后将发送一个Message给主线程,主线程收到Message后会将Message内容Toast出来。

09  * org.fneg.HandlerTestActivity.java

10  * Create at: 2012-6-4 下午9:39:19

11  * @author:feng

12  * Email:fengcunhan@gmail.com

13  *

14  */

15 public class HandlerTestActivity extends Activity {

16     private Handler uiHandler;

17     private ThreadWithLooper thread;

18     private Runnable showRunable;

19     @Override

20     public void onCreate(Bundle savedInstanceState) {

21         super.onCreate(savedInstanceState);

22         setContentView(R.layout.main);

23         uiHandler=new Handler(){

24             @Override

25             public void handleMessage(Message msg) {

26                 switch(msg.what){

27                 case Messages.MSG_HELLO:

28                      Toast.makeText(HandlerTestActivity.this, (String)msg.obj, Toast.LENGTH_SHORT).show();

29                     break;

30                      

31                 }

32             }

33         };

34         thread=new ThreadWithLooper(uiHandler);

35          

36         thread.start();

37         showRunable=new Runnable() {

38              

39             @Override

40             public void run() {

41                 //給线程发送一个Message

42                 thread.getHandler().sendEmptyMessage(Messages.MSG_HELLO);

43                 uiHandler.postDelayed(this, 2*1000);

44             }

45         };

46         uiHandler.post(showRunable);

47          

48     }

49      

50     @Override

51     protected void onStop() {

52         super.onStop();

53         uiHandler.removeCallbacks(showRunable);

54     }

55 }


01 import android.os.Handler;

02 import android.os.Looper;

03 import android.os.Message;

04  

05 /**

06  * 从线程发送消息到UI线程(主线程)

07  * org.fneg.ThreadWithLooper.java

08  * Create at: 2012-6-4 下午4:58:11

09  * @author:feng<br/>

10  * Email:fengcunhan@gmail.com

11  *

12  */

13 public class ThreadWithLooper extends Thread {

14     private Handler handler;

15      

16     private Handler uiHandler;

17      

18     public ThreadWithLooper(Handler mHandler){

19         this.uiHandler=mHandler;

20         //初始化Handler,接收到主线程发送过来的Message就回复一个Message给主线程,消息内容是 一个字符串和当前时间

21         handler =new Handler(){

22  

23             @Override

24             public void handleMessage(Message msg) {

25                 switch(msg.what){

26                 case Messages.MSG_HELLO:

27                      Message message=new Message();

28                      message.what=Messages.MSG_HELLO;

29                      message.obj="Yes!I get a hello"+System.currentTimeMillis();

30                      uiHandler.sendMessage(message);

31                     break;

32                      

33                 }

34             }

35              

36         };

37     }

38      

39     public Handler getHandler() {

40         return handler;

41     }

42  

43     public void setHandler(Handler handler) {

44         this.handler = handler;

45     }

46      

47 &n

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,