Android中的Handler机制

在android主线程中做太耗时的操作会引起ANR崩溃,为了进行线程间通信,就需要用到handler消息处理机制。消息传递分为两类,一种是从MainThread向WorkerThread传递消息,而另外一种是从WorkerThread向MainThread传递消息。由于主线程主要负责UI相关的事件,如用户的点击事件,屏幕触摸事件等,当捕捉到用户动作后将会分发到相应的组件进行处理。因此,主线程也叫UI线程。

首先,我来说一下handler工作流程。还是用流程图的方式来表示,这样看起来一目了然。

handler(发送消息)?MessageQueue(消息队列)?Looper(取出消息)?交给handler(调用handlerMessage方法去处理)?更新UI界面

简单地总结一下,就是在子线程中通过handler去发送一条消息到主线程,这条消息就会进入到消息队列MessageQueue中,然后在主线程中调用Looper对象来管理消息队列,不断的从消息队列中取出消息,并将消息分给对应的Handler来处理,最后更新UI界面。

  • 从WorkThread向MainThread发送消息 
 1 package com.example.handlertest;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.os.Handler;
 6 import android.os.Message;
 7 import android.view.Menu;
 8 import android.view.View;
 9 import android.view.View.OnClickListener;
10 import android.widget.Button;
11 import android.widget.TextView;
12 
13 public class MainActivity extends Activity {
14     
15     private Button mybutton;
16     private TextView mytextview;
17     private Handler handler;
18     @Override
19     protected void onCreate(Bundle savedInstanceState) {
20         super.onCreate(savedInstanceState);
21         setContentView(R.layout.activity_main);
22         mytextview=(TextView)findViewById(R.id.textview1);
23         mybutton=(Button)findViewById(R.id.button1);
24         mybutton.setOnClickListener(new ButtonListener());
25         handler=new firstHandler();
26     }
27     //不能直接在WorkerThread中去更新UI,所以使用handler来处理
28     class firstHandler extends Handler
29     {
30         @Override
31         public void handleMessage(Message msg) {
32             // TODO 在textview中显示获取到的数据
33             super.handleMessage(msg);
34             System.out.println("handlerMessage--->"+Thread.currentThread().getName());
35             String ss=(String)msg.obj;
36             mytextview.setText(ss);
37         }
38     }
39     class ButtonListener implements OnClickListener
40     {
41         @Override
42         public void onClick(View v) {
43             // TODO Auto-generated method stub
44             Thread td=new NetWorkThread();
45             td.start();
46         }
47     }
48     //开启一个子线程WorkerThread
49     class NetWorkThread extends Thread
50     {
51         @Override
52         public void run() {
53             // TODO 让线程休眠2s,利用handler向主线程发送消息
54             System.out.println("handlerMessage--->"+Thread.currentThread().getName());
55             super.run();
56             try
57             {
58                 Thread.sleep(1*1000);
59             }
60             catch(InterruptedException e)
61             {
62                 e.printStackTrace();
63             }
64             String s="全家福";
65             Message msg=handler.obtainMessage();
66             msg.obj=s;
67             handler.sendMessage(msg);
68         }
69     }
70 }
View Code

 

 

 

 

 

 

 

 

 

Android中的Handler机制,,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。