接上篇文章《安卓开发笔记——关于AsyncTask的使用》,今天来讲下在安卓开发里"重中之重"的另一个异步操作类Handler。

今天打算先讲下关于Handler的一些基本定义和使用方式

还是以一个下载图片为例,先看下实例效果:

好了,先来看下关于Handler的定义:

以上是官方对于Hanler类的描述,大致意思是说:Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分在消息队列中逐一将消息取出,然后对消息进行处理,也就是发送消息和接收消息不是同步的处理。 这种机制通常用来处理相对耗时比较长的操作。

1、Handler是一套更新UI的机制,在子线程中进行耗时操作,然后通过它来通知主线程对UI进行更新。

2、Handler也是一套消息处理机制,可以用它来发送消息和处理消息。

关于Handler的用途:

Handler可以分发Message对象和Runnable对象到主线程中,每个Handler的实例都会绑定到创建他的线程中(一般是位于主线程)

用途:1、安排消息或Runnable 在某个主线程中某个地方执行  2、安排一个动作在不同的线程中执行

接下来讲讲Handler的基本使用方式,今天先不讲太复杂,不引入线程和消息队列的概念,等下篇文章来说。

先来个教科书版本的Handler使用方式:(注释很全)

 package com.example.handlertest_01;

 import java.io.IOException;

 import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils; import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView; public class MainActivity extends Activity {
//声明所使用控件
private ImageView imageView;
private Button button;
private ProgressDialog progressDialog;
private String path = "http://pic.baomihua.com/photos/201110/m_6_634545730007187500_16585344.jpg";//下载图片的资源地址 //创建一个Handler对象
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
byte[] data=(byte[]) msg.obj;//直接obj对象
Bitmap bitmap=BitmapFactory.decodeByteArray(data, 0, data.length);
progressDialog.dismiss();
imageView.setImageBitmap(bitmap);
};
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//对控件进行实例化,并设置相对应属性
imageView = (ImageView) findViewById(R.id.imageView);
button = (Button) findViewById(R.id.bt);
progressDialog=new ProgressDialog(this);
progressDialog.setTitle("当前任务");
progressDialog.setMessage("正在下载图片,请稍后.."); //给按钮绑定监听
button.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
progressDialog.show();
new Thread(new MyThread()).start();//开辟一条子线程,执行该线程操作
}
}); } // 继承Runnable接口,开辟新线程访问网络资源
public class MyThread implements Runnable {
@Override
public void run() {
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(path);
try {
HttpResponse httpResponse = httpClient.execute(httpGet);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
// 访问成功
HttpEntity entity = httpResponse.getEntity();
// 阿帕奇提供的工具类EntityUtils可以很方便的把实体对象转换成字节码数组
byte[] data = EntityUtils.toByteArray(entity); Message message = handler.obtainMessage();//取得Message消息对象
message.obj = data;
handler.sendMessage(message);//利用handler发送消息
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} } }

这里的Message就是上文所提到的消息,这边有个特别需要主要的是如何得到一个Message的实例对象,官方不提倡我们直接new Message(),它提供了很多种方法让我们去获取,具体我们可以看下API文档:

Handler类:

Message类:

为什么不直接去new Message()对象,查看过源码的朋友可以发现,其实Message.obtain()或者是Handler.obtainMesssage()在源码里我们可以发现,Android给我们提供了一个消息池,这个消息池的大小为50而且加锁了,在我们调用这些方法的时候,系统会先去消息池里去取消息对象,如果不存在那么它才会去new出一个新的Message消息对象。

Message源代码:

以上API这里再列举一个:

                     Message message=Message.obtain(handler);
message.obj=data;
message.sendToTarget();

都很简单,大家参照着API给的规范去做就可以了。

Message对象,里面除了给我们提供了obj这个存储对象之外,它还帮我们提供了一些其他类型的存储变量,比如:

这几个变量都是Android给我们提供的轻消耗的变量,我们可以拿来用,例如arg1,arg2我们可以用来存放简单的整型变量,what我们可以用来存放消息的标识符,然后在handMessgae(Message msg)里用一个switch去判断要执行那些操作等等,用法和上面给的代码一致。

具体大家查看下API结合我刚给的注释,其实都很简单,这里就不一一举例了。

最后再看看下几个发送消息的API:

说几个易混淆的吧,其他的大家可以自己尝试玩玩

比如sendMessageDelayed是延迟发送回消息,后面跟着long类型的时间,以毫秒为单位。

还有sendMessAtTime是定时发送消息,时间由uptimeMills()传递

这两句是等效的,都是延时1秒将消息加入列队:

 handler.sendMessageAtTime(msg, SystemClock.uptimeMillis()+1000);
handler.sendMessageDelayed(msg, 1000);

好了,先介绍这么多吧,其他的等下篇文章再说。

安卓开发笔记——关于Handler的一些总结(上)的更多相关文章

  1. 安卓开发笔记——深入Activity

    在上一篇文章<安卓开发笔记——重识Activity >中,我们了解了Activity生命周期的执行顺序和一些基本的数据保存操作,但如果只知道这些是对于我们的开发需求来说是远远不够的,今天我 ...

  2. 安卓开发笔记——自定义广告轮播Banner(实现无限循环)

    关于广告轮播,大家肯定不会陌生,它在现手机市场各大APP出现的频率极高,它的优点在于"不占屏",可以仅用小小的固定空位来展示几个甚至几十个广告条,而且动态效果很好,具有很好的用户& ...

  3. 安卓开发笔记——丰富多彩的TextView

    随手笔记,记录一些东西~ 记得之前写过一篇文章<安卓开发笔记——个性化TextView(新浪微博)>:http://www.cnblogs.com/lichenwei/p/4411607. ...

  4. 安卓开发笔记——关于开源项目SlidingMenu的使用介绍(仿QQ5.0侧滑菜单)

    记得去年年末的时候写过这个侧滑效果,当时是利用自定义HorizontalScrollView来实现的,效果如下: 有兴趣的朋友可以看看这篇文件<安卓开发笔记——自定义HorizontalScro ...

  5. 安卓开发笔记——打造万能适配器(Adapter)

    为什么要打造万能适配器? 在安卓开发中,用到ListView和GridView的地方实在是太多了,系统默认给我们提供的适配器(ArrayAdapter,SimpleAdapter)经常不能满足我们的需 ...

  6. 安卓开发笔记——Fragment+ViewPager组件(高仿微信界面)

    什么是ViewPager? 关于ViewPager的介绍和使用,在之前我写过一篇相关的文章<安卓开发复习笔记——ViewPager组件(仿微信引导界面)>,不清楚的朋友可以看看,这里就不再 ...

  7. 安卓开发笔记(二十六):Splash实现首页快速开屏功能

    我们在进行安卓开发的时候,首页开有两种方式,一种是利用handler将一个活动进行延时,时间到达之后软件则会跳转到第二个活动当中.而另一种方法则是更加常用的方法,利用splash实现首页的快速开屏,这 ...

  8. 安卓开发笔记——关于AsyncTask的使用

    在安卓开发中,我们经常要进行一些耗时操作,比如数据库操作,获取网络资源,读取内存文件等等,当我们在处理这些耗时操作的时候,如果我们直接在UI主线程进行,那么可能会导致阻塞UI主线程,使得UI界面卡顿, ...

  9. 安卓开发笔记——Fragment+FragmentTabHost组件(实现新浪微博底部菜单)

    记得之前写过2篇关于底部菜单的实现,由于使用的是过时的TabHost类,虽然一样可以实现我们想要的效果,但作为学习,还是需要来了解下这个新引入类FragmentTabHost 之前2篇文章的链接: 安 ...

随机推荐

  1. 把git上面的scala工程转为eclipse工程

    1,安装sbt工具,url:https://www.cnblogs.com/zeling/p/8494828.html 2,把插件添加到plugins.sbt文件中: addSbtPlugin(&qu ...

  2. poj3073

    比赛状态堪忧,笑看自己找不着北.. 把心态放好吧- - 反正窝从一開始就仅仅是为了多学习才上道的 至少已经从学习和智商上给窝带来了一些帮助 智商带不动,好辛苦----(>_<)---- 说 ...

  3. udev简述

    udev 是 Linux 内核的设备管理器.总的来说,它取代了devfs和hotplug,负责管理/dev中的设备节点.同时,udev 也处理所有用户空间发生的硬件添加.删除事件,以及某些特定设备所需 ...

  4. 【整理】fiddler不能监听 localhost和 127.0.0.1的问题

    localhost/127.0.0.1的请求不会通过任何代理发送,fiddler也就无法截获. 解决方案 1,用 http://localhost. (locahost紧跟一个点号)2,用 http: ...

  5. svn cleanup失败

    今天用SVN的时候出现被锁定的情况,既不能更新代码也不能提交. 解决方法如下: 1. 在被锁定的文件夹上点右键,找到并点击Clean up菜单项 2. 在Cleanup对话框中勾选“Break loc ...

  6. python 安装pycurl

    yum install libghc-gnutls-dev opnssl nss -y 126 yum install libghc-gnutls-dev -y 127 yum install htt ...

  7. springmvc访问静态资源出现Request method 'GET' not supported

    答案最后.:D 默认的访问的URL都会被DispatcherServlet所拦截. 这里说一下如何配置springmvc访问静态文件. <mvc:default-servlet-handler/ ...

  8. WaitForSingleObject函数的使用

    等待函数可使线程自愿进入等待状态,直到一个特定的内核对象变为已通知状态为止.  WaitForSingleObject 函数 DWORD WaitForSingleObject( HANDLE hOb ...

  9. Java设计模式(1)工厂模式(Factory模式)

    工厂模式定义:提供创建对象的接口. 为何使用工厂模式 工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见. 为什么工厂模式是如此常用?因 ...

  10. 【转载】一文总结学习 Python 的 14 张思维导图

    本文主要涵盖了 Python 编程的核心知识(暂不包括标准库及第三方库,后续会发布相应专题的文章). 首先,按顺序依次展示了以下内容的一系列思维导图:基础知识,数据类型(数字,字符串,列表,元组,字典 ...