本讲内容:Handler使用入门

当用户点击一个按钮时如果执行的是一个常耗时操作的话,处理不好会导致系统假死,用户体验很差,而Android则更进一步,如果任意一个Acitivity没有响应5秒钟以上就会被强制关闭,因此我们需要另外起动一个线程来处理长耗时操作,而主线程则不受其影响,在耗时操作完结发送消息给主线程,主线程再做相应处理。那么线程之间的消息传递和异步处理用的就是Handler。

下面我们通过一个模拟文件下载的这个长耗时操作来做个说明:

1、新建一个项目 Lesson27_Handler

2、在MainHandler.java中写如下面内容:

  1. package android.basic.lesson27;
  2. import android.app.Activity;
  3. import android.app.ProgressDialog;
  4. import android.content.res.Resources;
  5. import android.os.Bundle;
  6. import android.os.Handler;
  7. import android.os.Message;
  8. import android.util.Log;
  9. import android.view.View;
  10. import android.widget.Button;
  11. public class MainHandler extends Activity {
  12. //声明变量
  13. private Button b1;
  14. private ProgressDialog pd;
  15. //定义Handler对象
  16. private Handler handler =new Handler(){
  17. @Override
  18. //当有消息发送出来的时候就执行Handler的这个方法
  19. public void handleMessage(Message msg){
  20. super.handleMessage(msg);
  21. //只要执行到这里就关闭对话框
  22. pd.dismiss();
  23. }
  24. };
  25. /** Called when the activity is first created. */
  26. @Override
  27. public void onCreate(Bundle savedInstanceState) {
  28. super.onCreate(savedInstanceState);
  29. setContentView(R.layout.main);
  30. Resources res= this.getResources();
  31. //查看UI组件所在的线程名
  32. Log.i("tag", "onCreate()-->"+Thread.currentThread().getName());
  33. //定义UI组件
  34. b1= (Button)findViewById(R.id.Button01);
  35. //给按钮绑定单击事件监听器
  36. b1.setOnClickListener(new View.OnClickListener() {
  37. @Override
  38. public void onClick(View v) {
  39. //点击按钮后去处理长耗时操作
  40. processThread();
  41. }
  42. });
  43. }
  44. private void processThread(){
  45. //构建一个下载进度条
  46. pd= ProgressDialog.show(MainHandler.this, "下载文件", "正在下载……");
  47. Log.i("tag", "processThread()-->"+Thread.currentThread().getName());
  48. new Thread(){
  49. @Override
  50. public void run(){
  51. Log.i("tag", "run()-->"+Thread.currentThread().getName());
  52. //在新线程里执行长耗时方法
  53. longTimeMethod();
  54. //执行完毕后给handler发送一个空消息
  55. handler.sendEmptyMessage(0);
  56. }
  57. }.start();
  58. }
  59. //模拟下载文件的长耗时方法
  60. private void longTimeMethod(){
  61. try {
  62. Log.i("tag", "longTimeMethod-->"+Thread.currentThread().getName());
  63. Thread.sleep(10000);
  64. } catch (InterruptedException e) {
  65. e.printStackTrace();
  66. }
  67. }
  68. }

3、res/layout/main.xml的内容就省略了,你们可以根据程序运行截图和程序代码反推出来布局组件。

4、运行程序查看结果:

这个例子里,在辅助线程的run方法中执行长耗时操作,操作完毕后调用handler.sendEmptyMessage()方法,主线程中的Handler的 handleMessage()方法接受到这一消息,并做了就是关闭对话框的处理。

转自:http://blog.csdn.net/feng88724/article/details/6170899

【Android】Handler使用入门的更多相关文章

  1. android 开发从入门到精通

    Android-Tips This is an awesome list of tips for android. If you are a beginner, this list will be t ...

  2. Android Camera2 拍照入门学习

    原文:Android Camera2 拍照入门学习 学习资料: 肾虚将军android camera2 详解说明 极客学院android.hardware.camera2 使用指南 Android 5 ...

  3. 学Android开发,入门语言java知识点

    学Android开发,入门语言java知识点 Android是一种以Linux为基础的开源码操作系统,主要使用于便携设备,而linux是用c语言和少量汇编语言写成的,如果你想研究Android,就去学 ...

  4. Android Studio单元测试入门

    Android Studio单元测试入门 通常在开发Android app的时候经常会写一些小函数并验证它是否运行正确,通常做法我们是把这个函数放到某个界面(Activity上)执行一下,运行整个工程 ...

  5. Android Handler leak 分析及解决办法

    In Android, Handler classes should be static or leaks might occur, Messages enqueued on the applicat ...

  6. 下面就介绍下Android NDK的入门学习过程(转)

    为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大. 2. 在NDK中调用第三方C/C++库,因为大部分的开源库 ...

  7. Android渗透测试Android渗透测试入门教程大学霸

    Android渗透测试Android渗透测试入门教程大学霸 第1章  Android渗透测试 Android是一种基于Linux的自由及开放源代码的操作系统,主要用于移动设备,如智能手机.平板等.目前 ...

  8. 一看就懂的Android APP开发入门教程

    一看就懂的Android APP开发入门教程 作者: 字体:[增加 减小] 类型:转载   这篇文章主要介绍了Android APP开发入门教程,从SDK下载.开发环境搭建.代码编写.APP打包等步骤 ...

  9. Android Handler练习

    package com.example.myact12; import java.util.Random; import android.support.v7.app.ActionBarActivit ...

随机推荐

  1. iOS开发--线程通信

    线程间的通信主要用于主线程与子线程的,也有用于子线程与子线程的 介绍下面几种通信方式 1.利用GCD方式(推荐) - (void)touchesBegan:(NSSet<UITouch *> ...

  2. Java-马士兵设计模式学习笔记-观察者模式-AWT简单例子

    1.AWT简单例子 TestFrame.java import java.awt.Button; import java.awt.Frame; import java.awt.event.Action ...

  3. requirejs 优化压缩

    1 配置node环境 2 配置built.js文档 3 执行命令node r.js -o built.js 文件目录: <!DOCTYPE HTML> <html lang=&quo ...

  4. HDU 4000 Fruit Ninja 树状数组 + 计数

    给你N的一个排列,求满足:a[i] < a[k] < a[j] 并且i < j < k的三元组有多少个. 一步转化: 求出所有满足 a[i] < a[k] < a[ ...

  5. javascript中对象的属性的特性

    1.ES5的属性特性包括下面六个: configurable: 表示能否通过delete来删除属性从而重新定义属性,能够修改属性的特性,默认为true enumberable: 表示是否能通过for- ...

  6. pyhton与json,Xml

    对简单数据类型的encoding 和 decoding: 使用简单的json.dumps方法对简单数据类型进行编码,例如: 1 2 3 4 5 6 import json   obj = [[1,2, ...

  7. 寄售Consignment和VMI有什么区别?

    Consignment 寄存一般是指卖方把货物存放在买方所属仓库,消耗后结帐.库存水平控制和货物的物理管理都由买方负责.这是目前很多大卖场通行的做法.典型的VMI一般也是指卖方把货物存放在买方附近的仓 ...

  8. minimum-number-of-arrows-to-burst-balloons(还挺好)

    https://leetcode.com/problems/minimum-number-of-arrows-to-burst-balloons/ 与会议室排期问题,很相似. package com. ...

  9. 为Gradle添加tomcat插件,调试WEB应用

    Gradle提供了不输于maven的依赖管理 提供了强大的test功能,输出优美的测试报告 并且提供war插件,使用内置的jetty调试WEB应用 因为博主偏偏钟情于tomcat,所以希望使用tomc ...

  10. 线程——QQ邮件发送

    一.造一个QQ邮件发送的窗体 二.开始编写关于邮件发送的代码,以及当点发送按钮的时候,给发送按钮单独造了一个新的线程.这样如果发送的附件太多的话,如果不给发送按钮造新的线程,便会卡住,但是如果给发送按 ...