一、 角色描述
1.Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。
2.Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper(从Message Queue取出)所送来的消息。
3. Message Queue(消息队列):用来存放线程放入的消息。
4.线程:UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue。
每一个线程里可含有一个Looper对象以及一个MessageQueue数据结构。在你的应用程序里,可以定义Handler的子类别来接收Looper所送出的消息。
在你的Android程序里,新诞生一个线程,或执行 (Thread)时,并不会自动建立其Message Loop。
Android里并没有Global的Message Queue数据结构,例如,不同APK里的对象不能透过Massage Queue来交换讯息(Message)。
例如:线程A的Handler对象可以传递消息给别的线程,让别的线程B或C等能送消息来给线程A(存于A的Message Queue里)。
线程A的Message Queue里的讯息,只有线程A所属的对象可以处理。
使用Looper.myLooper可以取得当前线程的Looper对象。
使用mHandler = new EevntHandler(Looper.myLooper()); 可用来构造当前线程的Handler对象;其中,EevntHandler是自已实现的Handler的子类别。
使用mHandler = new EevntHandler(Looper.getMainLooper()); 可诞生用来处理main线程的Handler对象;其中,EevntHandler是自已实现的Handler的子类别。
这样描述可能太抽像,下面举几个实际的例子来说明:
二、 举例
1. 同线程内不同组件间的消息传递
Looper类用来管理特定线程内对象之间的消息交换(Message Exchange)。你的应用程序可以产生许多个线程。而一个线程可以有许多个组件,这些组件之间常常需要互相交换讯息。如果有这种需要,您可以替线程构造一个Looper对象,来担任讯息交换的管理工作。Looper对象会建立一个MessageQueue数据结构来存放各对象传来的消息(包括UI事件或System事件等)。如下图:
每一个线程里可含有一个Looper对象以及一个MessageQueue数据结构。在你的应用程序里,可以定义Handler的子类别来接收Looper所送出的消息。
--------------------------打醬油---------------------------
運行效果圖:
繼上篇文章顯示時針的例子,這次在android線程裏面我又加入了動畫的方式,讓線程更好的幫助我們做更好的動畫效果,本例子,將用到四張圖片,每張圖片出來的顯示方式都不一樣,每隔三秒顯示一張不同的圖片,其顯示方式都不一樣,具體操作看代碼:
private static final int my_key = 0x123 ; private int a = 0 ; private int [] myImage = { R.drawable.aa, R.drawable.bb, R.drawable.cc, R.drawable.dd };
動畫效果的方案你可以參考:http://www.cnblogs.com/TerryBlog/archive/2010/05/30/1747311.html或者http://www.cnblogs.com/TerryBlog/archive/2010/05/31/1748628.html
線程的效果方案你可以參考:http://www.cnblogs.com/TerryBlog/archive/2010/06/01/1749516.html
本篇不過多解釋代碼,有任何問題可以參考以上三篇文章,下麵給出效果的全部代碼:
代码 package cn.terry; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.view.animation.RotateAnimation; import android.view.animation.ScaleAnimation; import android.view.animation.TranslateAnimation; import android.widget. * ; public class testHandler extends Activity implements Runnable { private static final int my_key = 0x123 ; private int a = 0 ; private int [] myImage = { R.drawable.aa, R.drawable.bb, R.drawable.cc, R.drawable.dd }; private Handler myHandler; private Thread myThread; private ImageView myImageView; private Animation myAnimationAlpha; private Animation myAnimationScale; private Animation myAnimationTranslate; private Animation myAnimationRotate; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); myImageView = (ImageView)findViewById(R.id.ImageView01); myAnimationAlpha = new AlphaAnimation( 0.1f , 1.0f ); myAnimationAlpha.setDuration( 3000 ); myAnimationScale = new ScaleAnimation( 0.0f , 1.4f , 0.0f , 1.4f , Animation.RELATIVE_TO_SELF, 0.5f , Animation.RELATIVE_TO_SELF, 0.5f ); myAnimationScale.setDuration( 3000 ); myAnimationTranslate = new TranslateAnimation( 30.0f , - 80.0f , 30.0f , 300.0f ); myAnimationTranslate.setDuration( 3000 ); myAnimationRotate = new RotateAnimation( 0.0f , + 350.0f , Animation.RELATIVE_TO_SELF, 0.5f ,Animation.RELATIVE_TO_SELF, 0.5f ); myAnimationRotate.setDuration( 3000 ); // myLinearLayout.setBackgroundColor(Color.WHITE); myHandler = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub switch (msg.what) { case testHandler.my_key: switch (a) { case 0 : myImageView.startAnimation(myAnimationAlpha); break ; case 1 : myImageView.startAnimation(myAnimationScale); break ; case 2 : myImageView.startAnimation(myAnimationTranslate); break ; case 3 : myImageView.startAnimation(myAnimationRotate); break ; default : break ; } myImageView.setImageResource(myImage[a - 1 ]); myImageView.setScaleType(ImageView.ScaleType.FIT_XY); // myImageView.setLayoutParams(new LayoutParams(300, 200)); if (a == myImage.length) { a = 0 ; } break ; default : break ; } super .handleMessage(msg); } }; myThread = new Thread( this ); myThread.start(); } @Override public void run() { // TODO Auto-generated method stub try { do { a ++ ; Thread.sleep( 4000 ); Message msg = new Message(); msg.what = testHandler.my_key; myHandler.sendMessage(msg); } while (Thread.interrupted() == false ); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } }}
源碼下載:/Files/TerryBlog/testHandler.rar
如果你有什麽疑問或者建議你可以 QQ:285735942 或者Email:terryyhl@gmail.com
转载于:https://www.cnblogs.com/TerryBlog/archive/2010/06/02/1749942.html
