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

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

hot3.png

 

一、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 } 

转载于:https://my.oschina.net/jintiangufei/blog/92376

你可能感兴趣的文章
PHP语言 -- Smarty函数
查看>>
电脑配置小知识
查看>>
一些可能常用的工具函数
查看>>
The Pilots Brothers' refrigerator(简单枚举)
查看>>
JavaScript 操作符
查看>>
《构建之法》读后感
查看>>
go语言接受者的选取
查看>>
php分页
查看>>
我们失去了,我们又没有失去什么
查看>>
ORACLE Index Lookup索引访问路径总结
查看>>
SpringMVC学习指南【笔记6】JSTL标签、函数
查看>>
GPS轨迹数据集免费下载资源整理
查看>>
考研?还是直接找工作?
查看>>
ue4 蓝图物体怎么不跟着蓝图动_UE4部分蓝图
查看>>
联通4g满格但是网速慢_为什么手机4G信号明明是满格,网络却很慢,背后的真实原因?...
查看>>
bable怎么使用 eclipse_Java Web轻松学46 - Maven集成到Eclipse中
查看>>
机器人 知乎碧桂园_碧桂园机器人首降淮阳,助力城市文化旅游
查看>>
ae2020不支持的视频驱动程序_音视频PaaS平台基于Windows的抓屏技术
查看>>
图纸打印什么时候用蓝图_工程图纸为什么是蓝图?
查看>>
网页中竖的目录怎么改成横的_骨架隔墙怎么做?
查看>>