Android线程处理之Handler

  上一篇已经简单为大家介绍了一下关于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是非常方便的,感兴趣的可以持续关注哟,下一篇更精彩。

 
时间: 2024-08-01 12:05:48

Android线程处理之Handler的相关文章

android线程通信之Handler

android中线程分为两种: 1)系统创建的用于处理UI界面和用户交互事件的主线程 2)自己创建的用于实现其他业务的子线程 UI中的控件是线程不安全的,只能在主线程中操作控件,不能在其他子线程中直接操作控件. 如果想在其他线程中操作主线程中的控件,只能通过发送一个消息告诉主线程去更新界面. 为了便于在线程间发送消息进行通信,android实现了Handler机制. 线程间通过Handler传递消息(Message).Message由一个FIFO的消息队列(MessageQueue)管理. 每个

Android线程处理之Handler总结

上一篇为大家介绍了如何通过Handler对象把Message数据发送到主线程,我想大家一定都已经掌握了,本篇我将以一个例子的方式为大家总结一下Handler的使用,例子是通过Handler实现一个图片自动改变的效果,一般我们都是通过Viewpage来实现这个效果,不过本篇我们就一起来学习一下如何通过Handler实现这个效果吧. 开始之前我们需要准备几张用来更新切换的图片,让后把这些图片放到res下面的drawable-hdpi下就可以了.有了这些我们就可以开始我们的效果实现了: 1.布局文件:

Android 线程更新UI报错 : Can't create handler inside thread that has not called Looper.prepare()

MainActivity中有一个按钮,绑定了save方法 public void save(View view) { String title = titleText.getText().toString(); String timelength = lengthText.getText().toString(); ExecutorService exec = Executors.newCachedThreadPool(); exec.execute(new NewsService(getApp

android线程控制UI更新(Handler 、post()、postDelayed()、postAtTime)

按照下面的理解就是handler与ui线程有一定的关联可以因为更新界面只能在主线程中所有更新界面的地方可以在接受消息的handleMessage那里还有更新界面可以在handler.port(new Runnable))在自定义的线程中然后执行post方法通知主线程去更新这个界面 下面是参考: Android 线程是单线程的. 所以更新UI要用到Handler: private Handler splashHandler = new Handler() {public void handleMe

android线程消息传递机制——Looper,Handler,Message

android线程消息传递机制——Looper,Handler,Message 在引入这些概念之前,我们先了解一下引入这些机制的背景. 出于性能优化的考虑,Android的UI操作并不是线程安全的(如果你不懂什么是线程安全,可以阅读一下<一起探究多进程与多线程>里的数据安全与可重入),这意味着如果有多个线程同时操作某个UI组件,可能导致线程安全问题.为了解决这个问题,Android制定了一条简单的规则:只允许UI线程修改Activity里的UI组件.这个UI线程也通常被我们称为主线程. 在此引

Android 线程问题 handler &amp; synctask

在安卓应用中,很多耗时的工作不能放在主线程,即ui线程中进行,因为会导致线程堵塞,使得系统判断程序运行异常,所以,需要多线程来进行异步操作,Android中提供了两种多线程的实现方式,此处注意,只要涉及ui更新的都必须要在主线程中进行 1.Handler handler有两个重要的构造方式,一个是空参数的,一个是带有Looper的,用空参数的方式生成的handler是和当前的线程关联的,一般是主线程,另一种是也可以为它提供一个Looper,这样它就会绑定到Looper所在的线程上.Handler

Android 线程 Looper.prepare()、Looper.loop() 使用

优化项目过程中发现了一个很Low的问题,整理一下,备忘: 说问题之前先看下HandlerThread的定义 一个封装了looper的线程: Looper用于封装了android线程中的消息循环,默认情况下一个线程是不存在消息循环(message loop)的,需要调用Looper.prepare()来给线程创建一个消息循环,调用Looper.loop()来使消息循环起作用,从消息队列里取消息,处理消息. 注:写在Looper.loop()之后的代码不会被立即执行,当调用后mHandler.get

Android多线程机制和Handler的使用

参考教程:iMooc关于Handler,http://www.imooc.com/learn/267 参考资料:Google提供Android文档Communicating with the UI Thread Handler的作用: Android开发中不允许UI主线程之外的线程更新,那么在主线程下建立Handler对象用于接收其他线程传来的数据(由Message携带)更新UI是Android提供的方法之一,另一个是我们熟知的更加轻量的AsyncTask类,这里不做展开,详细的Handler+

Android的消息处理(Handler相关)

首先Message(消息)类不用多说,内部用what(啥)属性来存放标识符,用obj(对象)来存放要携带的数据,用target(目标)来存放目标Handler. 所以需要有一个Handler(句柄)类来处理Message,方法是调用Handler类中的sendMessage(Message)方法,我之前一直觉得这个方法名的逻辑很奇怪,现在懂了,因为知道了另一个类: MessageQueue(消息队列),在调用sendMessage之后Handler会依次调用两个不是重载但跟重载也差不多的内部方法