您的位置:首页 > 其它

在线程中使用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐