上一篇已经简单为大家介绍了一下关于Handler的使用,本篇我们就一起再来探讨一下Handler的高级使用,上一篇我们仅仅是简单的进行UI界面的更新,本篇我们来一起探讨一下如何把子线程的数据发送到主线程进行处理,对于这个问题,我想一定有很多小伙伴困扰过,其实这很简单的,我之前和大家一样感觉在从子线程发送到主线程是不可能的,不过现在可以真正否定我之前的观点了,子线程向主线程发送数据是完全没问题的。好了,废话不多说,下面我们就一起来探讨一下吧。
1、我们通过Handler和Message来完成:
/* * 传递int型数据 */ new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } Message msg = new Message(); //mes.arg1、mes.arg2、mes.what:均只能传int型数据 msg.arg1 = 1; msg.arg2 = 2; msg.what = 3; handler.sendMessage(msg); } }).start();
处理Message发送过来的数据:
//声明一个Handler对象,并实现其中的handleMessage()方法 private Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { if(msg.what==3){ textview.setText("msg.arg1:"+msg.arg1+" msg.arg2:"+msg.arg2); }else{ if(msg.what==2){ Person person = (Person) msg.obj; textview.setText("姓名:"+person.getName()+" 性别:"+person.getSex()+" 年龄:"+person.getYear()); } } }; };
2、Message的使用:
上面我们向Handler发送的数据均为Int数据,这当然无法满足我们的日常需求,那如何通过Message向Handler发送一个Object数据呢?大家不要担心Message为我们封装了一个obj()方法,方便我们传递数据。
new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } Person person = new Person(); person.setName("小王"); person.setSex("girl"); person.setYear(22); Message msg = new Message(); msg.what = 2; msg.obj = person; handler.sendMessage(msg); } }).start(); }
Person是我封装的一个对象:
public class Person { private String name; private String sex; private int year; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getYear() { return year; } public void setYear(int year) { this.year = year; } }
对于这个Message的数据的处理,已经在上面的为大家展示。
看到这里你是不是已经感觉到Handler的强大,确实当我们处理多线程问题时,Handler是非常方便的,感兴趣的可以持续关注哟,下一篇更精彩。