万书网 > 文学作品 > Android从入门到精通 > 第135页

第135页



例12.3   在Eclipse中创建Android项目,名称为12.3,创建一个继承Thread类的LooperThread,并在重写的run()方法中创建一个Handler对象,发送并处理消息。(实例位置:光盘\TM\sl\12\12.3)

(1)创建一个继承了Thread类的LooperThread,并在重写的run()方法中创建一个Handler对象,发送并处理消息,关键代码如下:

public  class  LooperThread  extends  Thread  {



public  Handler  handler1;  //声明一个Handler对象



@Override



public  void  run()  {



super.run();



Looper.prepare();  //初始化Looper对象



//实例化一个Handler对象



handler1  =  new  Handler()  {



public  void  handleMessage(Message  msg)  {



Log.i("Looper",String.valueOf(msg.what));



}



};





Message  m=handler1.obtainMessage();  //获取一个消息



m.what=0x11;  //设置Message的what属性的值



handler1.sendMessage(m);  //发送消息



Looper.loop();  //启动Looper



}



}

(2)在MainActivity的onCreate()方法中,创建一个LooperThread线程,并开启该线程,关键代码如下:

LooperThread  thread=new  LooperThread();  //创建一个线程



thread.start();  //开启线程

运行本实例,在日志面板(LogCat)中输出如图12.5所示的内容。



图12.5 在日志面板(LogCat)中输出的内容

Looper类提供的常用方法如表12.1所示。

表12.1 Looper类提供的常用方法





方 法  描 述

prepare()  用于初始化Looper

loop()  启动Looper线程,线程会从消息队列里获取和处理消息

myLooper()  可以获取当前线程的Looper对象

getThread()  用于获取Looper对象所属的线程

quit()  用于结束Looper循环

注意:  写在Looper.loop()之后的代码不会被执行,该函数内部是一个循环,当调用Handler.  getLooper().quit()方法后,loop()方法才会中止,其后面的代码才能运行。

12.2.2 消息处理类(Handler)简介

消息处理类(Handler)允许发送和处理Message或Runnable对象到其所在线程的MessageQueue中。Handler主要有以下两个作用。

(1)将Message或Runnable应用post()或sendMessage()方法发送到MessageQueue中,在发送时可以指定延迟时间、发送时间及要携带的Bundle数据。当MessageQueue循环到该Message时,调用相应的Handler对象的handlerMessage()方法对其进行处理。

(2)在子线程中与主线程进行通信,也就是在工作线程中与UI线程进行通信。

说明:  在一个线程中,只能有一个Looper和MessageQueue,但是可以有多个Handler,而且这些Handler可以共享同一个Looper和MessageQueue。

Handler类提供的发送和处理消息的常用方法如表12.2所示。

表12.2 Handler类提供的常用方法





方 法  描 述

handleMessage(Message  msg)  处理消息的方法。通常重写该方法来处理消息,在发送消息时,该方法会自动回调

post(Runnable  r)  立即发送Runnable对象,该Runnable对象最后将被封装成Message对象

postAtTime(Runnable  r,  long  uptimeMillis)  定时发送Runnable对象,该Runnable对象最后将被封装成Message对象

postDelayed(Runnable  r,  long  delayMillis)  延迟发送Runnable对象,该Runnable对象最后将被封装成Message对象

sendEmptyMessage(int  what)  发送空消息

sendMessage(Message  msg)  立即发送消息

sendMessageAtTime(Message  msg,  long  uptimeMillis)  定时发送消息

sendMessageDelayed(Message  msg,  long  delayMillis)  延迟发送消息

12.2.3 消息类(Message)简介

消息类(Message)被存放在MessageQueue中,一个MessageQueue中可以包含多个Message对象。每个Message对象可以通过Message.obtain()或Handler.obtainMessage()方法获得。一个Message对象具有如表12.3所示的5个属性。

表12.3 Message对象的属性





属 性  类 型  描 述

arg1  int  用来存放整型数据

arg2  int  用来存放整型数据

obj  Object  用来存放发送给接收器的Object类型的任意对象

replyTo  Messenger  用来指定此Message发送到何处的可选Messager对象

what  int  用于指定用户自定义的消息代码,这样接收者可以了解这个消息的信息

说明:  使用Message类的属性可以携带int型数据,如果要携带其他类型的数据,可以先将要携带的数据保存到Bundle对象中,然后通过Message类的setDate()方法将其添加到Message中。

总之,Message类的使用方法比较简单,在使用时,需注意以下3点:

[√]尽管Message有public的默认构造方法,但是通常情况下,需要使用Message.obtain()或Handler.obtainMessage()方法来从消息池中获得空消息对象,以节省资源。



[√]如果一个Message只需要携带简单的int型信息,应优先使用Message.arg1和Message.arg2属性来传递信息,这比用Bundle更节省内存。



[√]尽可能使用Message.what来标识信息,以便用不同方式处理Message。

12.2.4 范例1:开启新线程获取网络图片并显示到ImageView中

例12.4   在Eclipse中创建Android项目,名称为12.4,开启新线程获取网络图片并显示到ImageView中。(实例位置:光盘\TM\sl\12\12.4)