Handler用來接收子線程發送的消息,並根據此數據來更新主程序中的UI;當主線程中的操作比較耗時,就需要把耗時的操作放到子線程中。在Android中,如果主線程在5s內沒有響應的話,就會彈“強制關閉”的提示框;
在布局文件中定義一個ImageView
[html]
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<ImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@string/description" />
</RelativeLayout>
在線程中隨機生成一個數,更新imageView ,在Handler中可以處理多個子線程發過來的數據,通過what變量來區分。
[java]
package com.example.handlerdemo;
import java.util.Random;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.widget.ImageView;
/**
* 實現在線程中隨機改變當前ImageView 在線程中以消息方式通知Handle更新主線程中的UI
*
* @author Administrator
*
*/
public class MainActivity extends Activity {
private static final int UPDATE_PIC = 0x100;
private static final int UPDATE_DATA = 0x101;
private ImageView imageView = null;
private MyHandler handler = null;
private UpdateThread updateThread = null;
private int[] path = new int[] { R.drawable.psb1, R.drawable.psb2,
R.drawable.psb3, R.drawable.psb4, R.drawable.psb5, R.drawable.psb6 };
private String[] names;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
names = getResources().getStringArray(R.array.arrays); // 獲取數組資源
imageView = (ImageView) findViewById(R.id.imageView);
handler = new MyHandler();
myThread t = new myThread();
Thread m = new Thread(t);
m.start(); // 開啟線程
updateThread = new UpdateThread();
handler.post(updateThread);
}
/**
* 接受消息和處理消息 ,此Handler會與當前主線程一塊運行
*
* @author Administrator
*
*/
private class MyHandler extends Handler {
public MyHandler() {
}
public MyHandler(Looper looper) {
super(looper);
}
/**
* 接收數據
*/
@Override
public void handleMessage(Message msg) {
if (msg.what == UPDATE_PIC) {
// 此處可以更新UI
imageView.setImageResource(path[msg.arg1]);
setTitle(msg.getData().getString("name"));
}
else if(msg.what == UPDATE_DATA){
System.out.println("data = " + msg.arg1);
}
else {
super.handleMessage(msg);
}
}
}
/**
* 實現隨機更新圖片,並通知Handler更新圖片
*
* @author Administrator
*
*/
private class myThread implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
int index = 0; // 保存產生的隨機數
// 如果線程沒有發生中斷,就一直執行
while (!Thread.currentThread().isInterrupted()) {
index = new Random().nextInt(path.length); // 產生一個小於length的隨機整數
Message message = handler.obtainMessage(); // 獲取一個Message
//用arg1、arg2傳遞消息,對系統資源消耗少
message.arg1 = index; // 保存要顯示的索引
message.what = UPDATE_PIC; // 設置消息標識
Bundle bundle = new Bundle(); // 獲取Bundle對象 存放數據
bundle.putString("name", names[index]); // 保存標題
message.setData(bundle); // 將Bundle對象保存到Message
handler.sendMessage(message); // 向Handler發送消息,更新UI
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
private class UpdateThread implements Runnable{
int index = 0;
@Override
public void run() {
// TODO Auto-generated method stub
index++;
Message message = handler.obtainMessage(); // 獲取一個Message
//用arg1、arg2傳遞消息,對系統資源消耗少
message.arg1 = index; // 保存要顯示的索引
message.what = UPDATE_DATA; // 設置消息標識
handler.sendMessage(message);
handler.postDelayed(updateThread, 3000);
}
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
handler.removeCallbacks(updateThread);
super.onDestroy();
}
}