博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转]Android的Handler总结
阅读量:6083 次
发布时间:2019-06-20

本文共 2932 字,大约阅读时间需要 9 分钟。

本文转自:

 

一、Handler的定义:

          主要接受子线程发送的数据, 并用此数据配合主线程更新UI.
          解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是点击一个 Button, Android会分发事件到Button上,来响应你的操作。  如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会收到Android系统的一个错误提示  "强制关闭".  这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,Android主线程是线程不安全的,也就是说,更新UI只能在主线程中更新,子线程中操作是危险的. 这个时候,Handler就出现了来解决这个复杂的问题,由于Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据,这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象,(里面包含数据)  , 把这些消息放入主线程队列中,配合主线程进行更新UI。

 

二、Handler一些特点

        handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),
        它有两个作用: (1):  安排消息或Runnable 在某个主线程中某个地方执行, (2)安排一个动作在不同的线程中执行
      
        Handler中分发消息的一些方法
        post(Runnable)
        postAtTime(Runnable,long)
        postDelayed(Runnable long)
        sendEmptyMessage(int)
        sendMessage(Message)
        sendMessageAtTime(Message,long)
        sendMessageDelayed(Message,long)
        以上post类方法允许你排列一个Runnable对象到主线程队列中,
        sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新.
三、Handler实例
      (1) 子类需要继承Handler类,并重写handleMessage(Message msg) 方法, 用于接受线程数据
      以下为一个实例,它实现的功能为 : 通过线程修改界面Button的内容

 1 
public
 
class
 MyHandlerActivity 
extends
 Activity {
 2 
    Button button;
 3 
    MyHandler myHandler;
 4 
 5 
    
protected
 
void
 onCreate(Bundle savedInstanceState) {
 6 
        
super
.onCreate(savedInstanceState);
 7 
        setContentView(R.layout.handlertest);
 8 
 9 
        button 
=
 (Button) findViewById(R.id.button);
10 
        myHandler 
=
 
new
 MyHandler();
11 
        
//
 当创建一个新的Handler实例时, 它会绑定到当前线程和消息的队列中,开始分发数据
12 
        
//
 Handler有两个作用, (1) : 定时执行Message和Runnalbe 对象
13 
        
//
 (2): 让一个动作,在不同的线程中执行.
14 
15 
        
//
 它安排消息,用以下方法
16 
        
//
 post(Runnable)
17 
        
//
 postAtTime(Runnable,long)
18 
        
//
 postDelayed(Runnable,long)
19 
        
//
 sendEmptyMessage(int)
20 
        
//
 sendMessage(Message);
21 
        
//
 sendMessageAtTime(Message,long)
22 
        
//
 sendMessageDelayed(Message,long)
23 
      
24 
        
//
 以上方法以 post开头的允许你处理Runnable对象
25 
        
//
sendMessage()允许你处理Message对象(Message里可以包含数据,)
26 
27 
        MyThread m 
=
 
new
 MyThread();
28 
        
new
 Thread(m).start();
29 
    }
30 
31 
    
/**
32 
    * 接受消息,处理消息 ,此Handler会与当前主线程一块运行
33 
    * 
*/
34 
35 
    
class
 MyHandler 
extends
 Handler {
36 
        
public
 MyHandler() {
37 
        }
38 
39 
        
public
 MyHandler(Looper L) {
40 
            
super
(L);
41 
        }
42 
43 
        
//
 子类必须重写此方法,接受数据
44 
        @Override
45 
        
public
 
void
 handleMessage(Message msg) {
46 
            
//
 TODO Auto-generated method stub
47 
            Log.d(
"
MyHandler
"
"
handleMessage......
"
);
48 
            
super
.handleMessage(msg);
49 
            
//
 此处可以更新UI
50 
            Bundle b 
=
 msg.getData();
51 
            String color 
=
 b.getString(
"
color
"
);
52 
            MyHandlerActivity.
this
.button.append(color);
53 
54 
        }
55 
    }
56 
57 
    
class
 MyThread 
implements
 Runnable {
58 
        
public
 
void
 run() {
59 
60 
            
try
 {
61 
                Thread.sleep(
10000
);
62 
            } 
catch
 (InterruptedException e) {
63 
                
//
 TODO Auto-generated catch block
64 
                e.printStackTrace();
65 
            }
66 
67 
            Log.d(
"
thread.......
"
"
mThread........
"
);
68 
            Message msg 
=
 
new
 Message();
69 
            Bundle b 
=
 
new
 Bundle();
//
 存放数据
70 
            b.putString(
"
color
"
"
我的
"
);
71 
            msg.setData(b);
72 
73 
            MyHandlerActivity.
this
.myHandler.sendMessage(msg); 
//
 向Handler发送消息,更新UI
74 
75 
        }
76 
    }
77 

78 } 

转载地址:http://tbkwa.baihongyu.com/

你可能感兴趣的文章
AOL重组为两大业务部门 全球裁员500人
查看>>
字符设备与块设备的区别
查看>>
为什么我弃用GNOME转向KDE(2)
查看>>
Redis学习记录初篇
查看>>
爬虫案例若干-爬取CSDN博文,糗事百科段子以及淘宝的图片
查看>>
Web实时通信技术
查看>>
第三章 计算机及服务器硬件组成结合企业运维场景 总结
查看>>
IntelliJ IDEA解决Tomcal启动报错
查看>>
默认虚拟主机设置
查看>>
php中的短标签 太坑人了
查看>>
[译] 可维护的 ETL:使管道更容易支持和扩展的技巧
查看>>
### 继承 ###
查看>>
数组扩展方法之求和
查看>>
astah-professional-7_2_0安装
查看>>
函数是对象-有属性有方法
查看>>
uva 10107 - What is the Median?
查看>>
Linux下基本栈溢出攻击【转】
查看>>
c# 连等算式都在做什么
查看>>
使用c:forEach 控制5个换行
查看>>
java web轻量级开发面试教程摘录,java web面试技巧汇总,如何准备Spring MVC方面的面试...
查看>>