在线程中使用handle,并接受主线程传过来的消息
2013-10-28 17:00
399 查看
之前研究过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
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
相关文章推荐
- Delphi使用TObject类对象创建接受window消息(使用Classes.AllocateHWnd为对象创建一个尺寸为0的窗口,从而有了Handle)good
- 使用Handler实现主线程与子线程之间互相传递消息
- Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程 与 子线程之间)
- Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程 与 子线程之间)
- 各个线程给主线程发消息避免锁的使用
- Handler写在主线程中,使用Message传递消息
- Android 系列 4.11使用活动线程队列和处理程序在线程之间发送消息
- 使用Handle进行Gson解析及开子线程从网络获得数据
- 使用PostThreadMessage在Win32线程间传递消息
- Android:主线程如何向子线程发送消息
- 使用PostThreadMessage在Win32线程间传递消息
- qt4 子线程给主线程发消息,发数据,通信,qthread gui postevent emit
- (转)Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- 使用线程的消息队列
- Handler消息传递机制(四)子线程接收主线程发送的消息
- 使用PostThreadMessage在Win32线程间传递消息
- C# 子线程使用主线程中的控件问题
- httpUrlConnection连接网络的用法(用到了handle传递消息,在主线程中更新UI)
- 使用PostThreadMessage向工作线程发送消息
- 野人学Android第二弹——主线程传递消息到次线程的摸索