Handler的定义:
主要接受子线程发送的数据, 并用此数据配合主线程更新UI.
最近做一个网络图片查看器的时候,遇到许多困难,于是有了Handler这个分析总结。
为什么要用他?
大家都知道在public static void main(String[] args){}中写程序直接run application就可以运行,这个是java中的主线程,但是有的时候并不是所用东西都能在主线程中运行的,有的时候联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象,机子会卡死. 这个时候我们需要把这些耗时的操作,放在一个子线程中。大家买票也是,现在买票分为好多中了,楼主今年去上海,是用的传统方式排队买票登的急死人了,回来的时候是在网上买的票直接在电脑上面取,方便多了。可以理解为排队是主线程,网上买书子线程,当所有人的东西都聚集在主线程时候,机器就会瘫痪,所以会用到子线程。
Handler是在主线程中的,为了使用子线程中的数据还需要一个Message这个类的帮助。
接下来说下流程:
第一步:
//1创建消息处理器,继承里面的handleMessage方法
- <P style="LINE-HEIGHT: 30px; TEXT-INDENT: 2em" align=left> </P>
复制代码- private Handler hanler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- // TODO Auto-generated method stub
- if(msg.what == 1) {
- String str = (String) msg.obj;
- et.setText(str);
- Toast.makeText(MainActivity.this, str, 0).show();
- }
- else {
- Toast.makeText(MainActivity.this, "匹配不成功", 0).show();
- }
- }
- };
复制代码 第二步:- //2.定义一个子线程
- final String str = "处理成功";
- new Thread() {
- public void run() {
- //如果不备注则会报错 Toast.makeText(MainActivity.this, "子线程已经启动", 0).show();
- //3.创建一个Message
- Message message = new Message();
- message.what = 1;
- message.obj = str;
- //4hanler调用sendMessage放入message方法
- hanler.sendMessage(message);
- }
- }.start();
- }
复制代码 解释:message.what = 1; 相当于定义规则
message.obj = str;相当于讲子线程中的数据存在Object中(message.obj 返回的是一个object类型,可以是数组,对象,集合等)。
子线程的启动:new Thead() {
public void run() {}
}.start();