在线程中使用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
- 在线程中使用handle,并接受主线程传过来的消息
- Handler消息传递机制(子线程中传递new Handler和主线程中new Handle传递消息)
- Handler(3)--在子线程中主线程的 消息队列发送消息
- 在异步线程中使用主线程的handler
- 在主线程中终止带消息处理的线程的方法
- handle处理主线程消息的两种方法
- Handler详解系列(三)——在子线程中给主线程的消息队列发送消息
- MFC主线程安全关闭子线程的方法:使用PostThreadMessage在Win32线程间传递消息
- 接受sendmessage(application.handle..)的消息?
- Android中使用Handler在主线程和子线程中传消息报空指针异常
- android中实现在工作线程与主线程互发消息
- android中实现在工作线程中向主线程发消息
- 在当前线程中访问主线程的控件
- WebBrowser在非主线程的线程中创建
- 在主线程的handler里开子线程 主线程会卡主
- 工作线程中利用handler向主线程发送消息
- Android线程中消息处理(Handle,Looper)
- 关于在子线程中在run方法执行完之后通知主线程进行操作的方法。(Toast在子线程中无法使用)
- mysql字符串匹配度查询排序
- 求职面试过程中遇到的几个技术题
- MYSQL varchar 类型 排序错乱问题的解决
- halcon如何创建自己的函数
- HTML5标签
- 在线程中使用handle,并接受主线程传过来的消息
- 四个因素:可能导致百度不收录你的网站页面
- ORACLE TSPITR的基本过程剖析
- 大学英语六级听力——007(An old man)
- tolua++使用
- ASP.NET冻结列
- js 运算 除法运算会保留小数,和js里怎么求余数
- 我来解释一下什么是ROOT以及原理
- 【JAVA】jacob写word