在android中,有很多功能是不能放在onCreate或者onStart方法里面,因为这些功能相对

来说费时比较长,比如说下载一个文件,下载的过程比较长,但是如果写在Activity中,

那么这段时间Activity是完全没有响应的,那么就可以将这种处理大量数据或者耗时比较

长的东西放在一个单独的线程中来完成,即Activity是一个线程,而下载的是在另外一个

线程,那么这样就可以使得下载跟Activity之间互不影响,从而得到了良好的用户体验

这里有两种队列,一种是线程队列,就是用postXX方法或者removeCallbacks方法对线程对象的操作。另一种是消息队列,用sendMessage和handleMessage方法来对消息对象进行处理

handler采用的是一个消息队列的方式,每一个handler都有一个与之关联的消息队列,而且是先进先出的方式执行,即:每次加入一个handler,然后拿出来,对其进行处理,然后再拿出另一个,再进行处理

例子一:这个例子仅仅是对线程对象进行操作的测试

package org.hualang.handler;import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;public class HandlerTest extends Activity {private Button mybutton1;private Button mybutton2;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);mybutton1 = (Button)findViewById(R.id.mybutton1);mybutton2 = (Button)findViewById(R.id.mybutton2);mybutton1.setOnClickListener(new Button.OnClickListener(){@Overridepublic void onClick(View arg0) {/*** 调用Handler的post方法,将要执行的线程对象添加到* 线程队列中*/handler.post(updateThread);}});mybutton2.setOnClickListener(new Button.OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stub
                handler.removeCallbacks(updateThread);}});  }//创建Handler对象Handler handler = new Handler();/*** 将要执行的操作卸载写入线程对象的run()方法当中*/Runnable updateThread = new Runnable(){public void run(){System.out.println("更新线程");//在run方法内部,执行postXX的方法,每隔3秒会执行一次handler.postDelayed(updateThread, 3000);}};
}

程序解释:首先创建一个Handler对象,然后创建一个继承自Runnable接口的线程

程序首先点击按钮“开始”,于是会马上执行post方法,将执行的线程对象添加到线程队列中,这时会马上执行

public void run(){System.out.println("更新线程");//在run方法内部,执行postXX的方法,每隔3秒会执行一次handler.postDelayed(updateThread, 3000);}

然后,执行postDelayed方法,由于里面设置的间隔时间,所以每3秒会调价一个handler对象到线程队列中,并且一直执行,直到点击“结束”按钮,调用removeCallbacks方法将其从线程队列中移除

例子2:下面的例子将简单的对线程对象和消息对象进行处理

package org.hualang.handlertest2;import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;public class HandlerTest2 extends Activity {private ProgressBar bar = null;private Button start = null;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);bar = (ProgressBar)findViewById(R.id.progress1);start = (Button)findViewById(R.id.start);start.setOnClickListener(new Button.OnClickListener(){@Overridepublic void onClick(View v) {bar.setVisibility(View.VISIBLE);handler.post(handlerThread);}});}/*** 使用匿名内部类来复写hanlder当中的hanldrMessage方法* 这里的msg对象就是从线程部分发送过来的对象*/Handler handler = new Handler(){public void handleMessage(Message msg){bar.setProgress(msg.arg1);handler.post(handlerThread);}};//线程类,该类使用的是匿名内部类的方式进行声明Runnable handlerThread = new Runnable(){int i = 0;public void run(){System.out.println("开始线程");i = i + 10;/*** 得到一个消息对象,Message类是由android操作系统提供* obtainMessage方法用来得到Message对象*/Message msg = handler.obtainMessage();/*** Message中有个成员变量,即msg独享的arg1参数* 将其值设置为i。用arg1或arg2这两个成员变量传递* 消息,优点是系统性能消耗较少*/msg.arg1 = i;try {//当前线程休眠1秒Thread.sleep(5000);} catch (InterruptedException e) {// TODO Auto-generated catch block
                e.printStackTrace();}/*** 发送一个消息,用sendMessage是将msg加入到消息* 队列中。而post是将线程加入到线程队列中*/handler.sendMessage(msg);if( i == 100){/*** 如果i=100的时候,就将线程对象* 从handler当中移除*/handler.removeCallbacks(handlerThread);bar.setVisibility(View.GONE);}}};
}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent">
<ProgressBarandroid:id="@+id/progress1"android:layout_width="fill_parent"android:layout_height="wrap_content"android:visibility="gone"style="?android:attr/progressBarStyleHorizontal"
/>
<Buttonandroid:id="@+id/start"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center"android:text="点击我"
/>
</LinearLayout>

程序说明:

1、当点击按钮后,会执行按钮的onClick方法中的

bar.setVisibility(View.VISIBLE);
handler.post(handlerThread);

将进度条显示出来,并且将线程对象加入到线程队列中

2、线程对象对先打印出一个“开始线程”,然后i的值增加10,然后从系统中获取一个Message对象

3、将i赋给Message对象的参数arg1

4、当前线程休眠5秒,然后通过sendMessage方法发送一个Message对象发送到消息队列中

5、然后再执行,通过handleMessage方法设置进度条的值,并且将其加入到进程队列中

Handler handler = new Handler(){public void handleMessage(Message msg){bar.setProgress(msg.arg1);handler.post(handlerThread);}};

6、循环执行,直到i=100,进度条隐藏,并将线程对象从线程队列中取出

原文:http://www.iteye.com/topic/1062942

转载于:https://www.cnblogs.com/yiki/p/3183285.html

Android---组件篇---Handler的使用(1)[转]相关推荐

  1. Xamarin Android组件篇教程RecylerView动画组件RecylerViewAnimators(1)

    Xamarin Android组件篇教程RecylerView动画组件RecylerViewAnimators(1) RecyclerView是比ListView和GridView更为强大的布局视图, ...

  2. Android攻城狮组件篇—BroadcastReceiver

    组件篇-BroadcastReceiver 1. Boastcast(广播)是一种广泛运用的在应用程序之间传输信息的机制. 2. BroadcastReceiver(广播接受者)是对发送出来的广播进行 ...

  3. android组件化开发视频教程,教你打造一个Android组件化开发框架

    作者简介 本篇来自 lucky_billy 的投稿,分享了他的开源组件化框架,详细地讲解框架形成的思路,希望对大家有所帮助. lucky_billy 的博客地址: 解读开源框架设计思想 B站学习视频 ...

  4. 教你打造一个Android组件化开发框架

    *本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 CC:Component Caller,一个android组件化开发框架, 已开源,github地址:https://github ...

  5. 单独组件_阿里P8年薪百万大牛-教你打造一个Android组件化开发框架

    作者简介 本篇来自 lucky_billy 的投稿,分享了他的开源组件化框架,详细地讲解框架形成的思路,希望对大家有所帮助. lucky_billy 的博客地址: http://blog.csdn.n ...

  6. 【建议收藏】2020年中高级Android大厂面试秘籍,为你保驾护航金三银四,直通大厂(Android高级篇上)...

    前言 成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~. A awesome android expert interview questions a ...

  7. 【朝花夕拾】Android性能篇之(七)Android跨进程通信篇

    前言 转载请声明,转自[https://www.cnblogs.com/andy-songwei/p/10256379.html],谢谢! 只要是面试高级工程师岗位,Android跨进程通信就是最受面 ...

  8. 【朝花夕拾】Android性能篇之(七)Android跨进程通信篇...

    前言 原文:https://www.cnblogs.com/andy-songwei/p/10256379.html 只要是面试高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点之一. ...

  9. 【建议收藏】2020年中高级Android大厂面试秘籍,为你保驾护航金三银四,直通大厂(Android基础篇)...

    前言 成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~. A awesome android expert interview questions a ...

  10. Android消息机制Handler用法

    这篇文章介绍了Android消息机制Handler用法总结,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 1.简述 Handler消息机制主要包括: Messa ...

最新文章

  1. 旷视提Circle Loss,统一优化视角,革新深度特征学习范式 | CVPR 2020
  2. 尴尬!嫌疑人以为警察不懂技术偷删代码,不料被当场识破
  3. mysql merge 分区
  4. 一个实用的表格(锁定表头,可调整单元格大小,可排序)
  5. 邮局--dp经典问题
  6. Go 神坑 1 —— interface{} 与 nil 的比较
  7. JS获取短信验证码60秒
  8. proe把零件转化为stl在unity中使用注意事项
  9. Go - 访问C动态分配数组
  10. Linux低分辨率下时钟中断调用流程
  11. 《区块链技术指南》一
  12. dmg2iso使用及转换DMG文件遇到的问题
  13. 【计算机毕业设计】java+mysql基于SSM的生鲜超市进销存管理系统
  14. Python图片添加水印修改MD5值
  15. 利用halcon识别汽车检具孔面积和孔间距
  16. String类最详解(String、StringBuffer、StringBuilder、正则表达式)表格+代码让你一文读懂!!!
  17. QuickBooks 2016 for Mac(财务管理软件)
  18. 区块链修仙小说走红,刘慈欣的《三体》是其先驱?
  19. Ural 1998 The old Padawan(二分)
  20. 关于大学生创新创业训练项目

热门文章

  1. 白盒测试黑盒测试和单元测试集成测试和系统测试的关系
  2. modelsim 自动化 独立仿真vivado ip核工程
  3. php后台数据显示到前端,php,前端_怎么在javascript中得到后台数据?,php,前端,javascript,highcharts - phpStudy...
  4. Word自定义多级符号方法
  5. Ubuntu10.04下gFtp2.0.19 远程客户端中文乱码解决方法
  6. python以及MATLAB终止循环的快捷键
  7. 自动随机逐层剪枝openpose
  8. C# 删除文件错误 access denied
  9. sed 命令自己总结
  10. php-fpm进程关闭与重启脚本详解(转)