Handler的入门了解

Posted EdwardRu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Handler的入门了解相关的知识,希望对你有一定的参考价值。

何为Handler

Handler是android为我们提供的一个更新UI的机制,也是一套信息处理的机制,通过他,可以进行发送信息,也可以处理信息。andriod提供了Handler 和 Looper 来满足线程间的通信。Handler先进先出原则。Looper类用来管理特定线程内对象之间的消息交换

1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。
2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息。
3) Message Queue(消息队列):用来存放线程放入的消息。

4)线程:UIthread 通常就是main thread,而Android启动程序时会替它建立一个MessageQueue。

 

默认的情况下,Android是不允许在非UI线程中更新UI的,子线程中操作是危险的. 这个时候,Handler就出现了来解决这个复杂的问题,由于Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据,这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象,(里面包含数据)  , 把这些消息放入主线程队列中,配合主线程进行更新UI。

 

使用过程

 

1定义Handler对象并初始化,重写handleMessage()函数

 

2定义Thread线程对象,通常写成一个类形式(如class ThreadTest implements Runnable),在run()方法中操作数据,并把数据handler.sendMessage()方法传输     到handler对象中,并开启线程。(注意:该步骤不一定用Thread实现,也可以利用TimeTask实现,具体的操作同样放在run()方法中)

 

3在handleMessage()函数中根据不同的数据形式实现不同的方法。

 

public class MainAcitivity extends Activity {  
12.    /** Called when the activity is first created. */  
13.    private Handler handler=new Handler(){  
14.        public void handleMessage(Message msg){  
15.            switch (msg.arg1) {  
16.            case 1:  
17.                txtTextView.setText("bbbb");  
18.                break;  
19.            case 2:  
20.                setTitle("aaa");  
21.            default:  
22.                break;  
23.            }  
24.        }  
25.    };  
26.    private Button btn;  
27.    private TextView txtTextView;  
28.    @Override  
29.    public void onCreate(Bundle savedInstanceState) {  
30.        super.onCreate(savedInstanceState);  
31.        setContentView(R.layout.main);  
32.        txtTextView=(TextView)findViewById(R.id.txtView);  
33.        btn=(Button)findViewById(R.id.btn);  
34.        btn.setOnClickListener(new OnClickListener() {  
35.              
36.            public void onClick(View arg0) {  
37.                ThreadTest threadTest=new ThreadTest();  
38.                new Thread(threadTest).start();  
39.                  
40.                ThreadTest2 threadTest2=new ThreadTest2();  
41.                new Thread(threadTest2).start();  
42.            }  
43.        });  
44.    }  
45.    private class ThreadTest implements Runnable{  
46.  
47.        public void run() {  
48.            // TODO Auto-generated method stub  
49.            try{  
50.                Thread.sleep(1000);  
51.            }  
52.            catch (Exception e) {  
53.                e.printStackTrace();  
54.            }  
55.            Message msgMessage=new Message();  
56.            msgMessage.arg1=1;  
57.            handler.sendMessage(msgMessage);  
58.            Log.e("ThreadName", Thread.currentThread().getName());  
59.        }  
60.          
61.    }  
62.      
63.    private class ThreadTest2 implements Runnable{  
64.  
65.        public void run() {  
66.            // TODO Auto-generated method stub  
67.            try{  
68.                Thread.sleep(1000);  
69.            }  
70.            catch (Exception e) {  
71.                e.printStackTrace();  
72.            }  
73.            Message msgMessage=new Message();  
74.            msgMessage.arg1=2;  
75.            handler.sendMessage(msgMessage);  
76.            Log.e("ThreadName", Thread.currentThread().getName());  
77.        }  
78.          
79.    }  
80.}  

 

以上是关于Handler的入门了解的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio - 如何从片段中停止 handler.postDelayed?

Netty入门——Handler & Pipeline

Handler机制从入门到放弃

推荐net开发cad入门阅读代码片段

自定义无内存泄漏的Handler内部类

八.Netty入门到超神系列-Netty入门程序