通过分析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; |
08 |
* 这个类是主线程,它每隔两秒就发送一个Message给线程,线程收到Message后将发送一个Message给主线程,主线程收到Message后会将Message内容Toast出来。 |
09 |
* org.fneg.HandlerTestActivity.java |
10 |
* Create at: 2012-6-4 下午9:39:19 |
12 |
* Email:fengcunhan@gmail.com |
15 |
public class
HandlerTestActivity extends
Activity { |
16 |
private
Handler uiHandler; |
17 |
private
ThreadWithLooper thread; |
18 |
private
Runnable showRunable; |
20 |
public
void onCreate(Bundle savedInstanceState) { |
21 |
super .onCreate(savedInstanceState); |
22 |
setContentView(R.layout.main); |
23 |
uiHandler= new
Handler(){ |
25 |
public
void handleMessage(Message msg) { |
27 |
case
Messages.MSG_HELLO: |
28 |
Toast.makeText(HandlerTestActivity. this , (String)msg.obj, Toast.LENGTH_SHORT).show(); |
34 |
thread= new
ThreadWithLooper(uiHandler); |
37 |
showRunable= new
Runnable() { |
42 |
thread.getHandler().sendEmptyMessage(Messages.MSG_HELLO); |
43 |
uiHandler.postDelayed( this ,
2 * 1000 ); |
46 |
uiHandler.post(showRunable); |
51 |
protected
void onStop() { |
53 |
uiHandler.removeCallbacks(showRunable); |
01 |
import android.os.Handler; |
02 |
import android.os.Looper; |
03 |
import android.os.Message; |
07 |
* org.fneg.ThreadWithLooper.java |
08 |
* Create at: 2012-6-4 下午4:58:11 |
10 |
* Email:fengcunhan@gmail.com |
13 |
public class
ThreadWithLooper extends
Thread {
|
14 |
private
Handler handler; |
16 |
private
Handler uiHandler; |
18 |
public
ThreadWithLooper(Handler mHandler){ |
19 |
this .uiHandler=mHandler; |
21 |
handler = new
Handler(){ |
24 |
public
void handleMessage(Message msg) { |
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); |
39 |
public
Handler getHandler() { |
43 |
public
void setHandler(Handler handler) { |
44 |
this .handler = handler; |
03 |
* org.fneg.Messages.java |
04 |
* Create at: 2012-6-4 下午4:51:20 |
06 |
* Email:fengcunhan@gmail.com |
09 |
public class
Messages { |
10 |
public
static final
int MSG_HELLO= 0X1 ; |