在线程中使用handle,并接受主线程传过来的消息

来源:互联网 发布:悠悠球淘宝 编辑:程序博客网 时间:2024/05/28 05:14

之前研究过handler 和 looper 消息队列,不过Android里的handler不是另外开启线程来执行的,还是在主UI线程中,如果想另启线程的话需要用到HandlerThread来实现。在使用HandlerThread的时候需要实现CallBack接口以重写handlerMessage方法,在handlerMessage方法中来处理自己的逻辑。下来给出一个小例子程序。

layout文件很简单,就一个按钮来启动HanlderTread线程
1.<?xml version="1.0" encoding="utf-8"?> 
2.<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
3.    android:layout_width="fill_parent" 
4.    android:layout_height="fill_parent" 
5.    android:orientation="vertical" > 
6. 
7.    <TextView 
8.        android:layout_width="fill_parent" 
9.        android:layout_height="wrap_content" 
10.        android:text="@string/hello" /> 
11. 
12.    <Button 
13.        android:id="@+id/handlerThreadBtn" 
14.        android:layout_width="wrap_content" 
15.        android:layout_height="wrap_content" 
16.        android:text="startHandlerThread" /> 
17. 
18.</LinearLayout> 


Activity代码如下:

1.package com.tayue; 
2. 
3.import android.app.Activity; 
4.import android.os.Bundle; 
5.import android.os.Handler; 
6.import android.os.Handler.Callback; 
7.import android.os.HandlerThread; 
8.import android.os.Message; 
9.import android.view.View; 
10.import android.view.View.OnClickListener; 
11.import android.widget.Button; 
12./**
13. * 
14. * @author xionglei
15. *
16. */ 
17.public class TestHandlerActivity extends Activity implements OnClickListener{ 
18.     
19.    public Button handlerThreadBTN;  
20.    MyHandlerThread handlerThread; 
21.    Handler handler; 
22.     
23.    /** Called when the activity is first created. */ 
24.    @Override 
25.    public void onCreate(Bundle savedInstanceState) { 
26.        super.onCreate(savedInstanceState); 
27.        //打印UI线程的名称  
28.        System.out.println("onCreate  CurrentThread = " + Thread.currentThread().getName()); 
29.         
30.        setContentView(R.layout.main); 
31.         
32.        handlerThreadBTN = (Button) findViewById(R.id.handlerThreadBtn); 
33.        handlerThreadBTN.setOnClickListener(this); 
34.         
35.        handlerThread = new MyHandlerThread("myHanler"); 
36.        handlerThread.start(); 
37.        //注意: 这里必须用到handler的这个构造器,因为需要把callback传进去,从而使自己的HandlerThread的handlerMessage来替换掉Handler原生的handlerThread  
38.        handler = new Handler(handlerThread.getLooper(), handlerThread); 
39.         
40.         
41.    } 
42. 
43.    @Override 
44.    public void onClick(View v) { 
45.        //点击按钮后来开启线程  
46.        handler.sendEmptyMessage(1); 
47.    } 
48.     
49.     
50.    private class MyHandlerThread extends HandlerThread implements Callback { 
51. 
52.        public MyHandlerThread(String name) { 
53.            super(name); 
54.        } 
55. 
56.        @Override 
57.        public boolean handleMessage(Message msg) { 
58.            //打印线程的名称  
59.            System.out.println(" handleMessage CurrentThread = " + Thread.currentThread().getName()); 
60.            return true; 
61.        } 
62.         
63.         
64.    } 
65.     
66.     
67.     
68.     
69.} 


点击按钮,打印的日志如下(这里点击了3次)
07-06 09:32:48.776: I/System.out(780): onCreate  CurrentThread = main
07-06 09:32:55.076: I/System.out(780):  handleMessage CurrentThread = myHanler
07-06 09:32:58.669: I/System.out(780):  handleMessage CurrentThread = myHanler
07-06 09:33:03.476: I/System.out(780):  handleMessage CurrentThread = myHanler

 HandlerThread就这么简单。

 当然 android自己也有异步线程的handler,就是AsyncTask,这个类就是封装了HandlerThread 和handler来实现异步多线程的操作的。

本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2012-07/64602.htm

原创粉丝点击