一、 角色描述
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.fengfly.com/plus/view-181802-1.html或者http://www.fengfly.com/plus/view-181804-1.html
線程的效果方案你可以參考:hthttp://www.fengfly.com/plus/view-181805-1.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