关于Handler的理解(附带实例)

       Handler的作用主要是接受子线程发送的数据, 并用此数据配合主线程更新UI。很多情况下,我们的项目会遇到一些耗时的操作,例如获取一个比较大的文件的内容的时候,或者联网获取数据。但是这些耗时的操作不能够放在UI线程(即主线程)中进行,因为会造成界面假死的现象(如果5秒钟程序没有执行完毕的话,Android系统会发出一个错误提示要求  "强制关闭"该程序)。一般的处理方法是把这些耗时的操作放在一个子线程中(与UI线程不是同一个线程),但是问题来了,因为更新UI只能在主线程中更新,而子线程是不能够更新UI界面的。这怎么办呢?还好有Handler来帮忙,Handler本身处于UI主线程当中,可以更新UI界面,而且Handler可以通过Message对象来与子线程之间相互传递信息。具体来说,由于Handler运行在主线程中(UI线程中),  它与子线程可以通过Message对象来传递数据, 这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传递)Message对象(里面包含数据),然后把这些消息放入主线程队列中,配合主线程进行更新UI。

     handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程)。它有两个作用:(1):  安排消息或Runnable 在某个主线程中某个地方执行, (2)安排一个动作在不同的线程中执行。如果要实现Handler的话,则需要继承Hendler类,并重写handleMessage(Message msg) 方法, 用于接受线程数据,以下为示例。

项目名称为MyHandlerActivityActivity,界面布局main.xml就是默认的布局的基础上添加一个Button,id为button。这个实例运行的结果就是更改Button按钮的显示内容。下面是源码:

package com.whu.wyt.Handler;


import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.widget.Button;


public class MyHandlerActivityActivity extends Activity {
public class MyHandlerActivity extends Activity {
   Button button;
   MyHandler myHandler;
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
       button = (Button) findViewById(R.id.button);
       myHandler = new MyHandler();
       // 当创建一个新的Handler实例时, 它会绑定到当前线程和消息的队列中,开始分发数据
       // Handler有两个作用, (1) : 定时执行Message和Runnalbe 对象
       // (2): 让一个动作,在不同的线程中执行.
       // 它安排消息,用以下方法
       // post(Runnable)
       // postAtTime(Runnable,long)
       // postDelayed(Runnable,long)
       // sendEmptyMessage(int)
       // sendMessage(Message);
       // sendMessageAtTime(Message,long)
       // sendMessageDelayed(Message,long)
      
       // 以上方法以 post开头的允许你处理Runnable对象
       //sendMessage()允许你处理Message对象(Message里可以包含数据,)
       MyThread m = new MyThread();
       new Thread(m).start();
   }
   /**
    * 接受消息,处理消息 ,此Handler会与当前主线程一块运行
    * */
   class MyHandler extends Handler {
       public MyHandler() {
       }
       public MyHandler(Looper L) {
           super(L);
       }
       // 子类必须重写此方法,接受数据
       @Override
       public void handleMessage(Message msg) {
           // TODO Auto-generated method stub
           Log.d("MyHandler", "handleMessage......");
           super.handleMessage(msg);
           // 此处可以更新UI
           Bundle b = msg.getData();
           String color = b.getString("color");
           MyHandlerActivity.this.button.setText(color);
       }
   }
   class MyThread implements Runnable {
       public void run() {
           try {
               Thread.sleep(9000);  //9秒钟
           } catch (InterruptedException e) {
               // TODO Auto-generated catch block
               e.printStackTrace();
           }
           Log.d("thread.......", "mThread........");
           Message msg = new Message();
           Bundle b = new Bundle();// 存放数据
           b.putString("color", "handler测试");
           msg.setData(b);
           MyHandlerActivity.this.myHandler.sendMessage(msg); // 向Handler发送消息,更新UI
       }
   }
}
}



程序运行起来后,按钮上的显示文字为默认的(或者是你在布局文件中设置的),等待9秒钟后,按钮上的显示文字变成"handler测试"。.说明Handler帮助子线程达到了更新UI界面的目的。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值