多線程編程在編程中占有很大的地位,android手機的多核時代的到來,為瞭提高資源的利用率,多線程的學習是必須的,一般會用的Handler類,下面是handler的一些介紹。
Handler的特點
1. 傳遞Message。用於接受子線程發送的數據, 並用此數據配合主線程更新UI。
在Android中,對於UI的操作通常需要放在主線程中進行操作。如果在子線程中有關於UI的操作,那麼就需要把數據消息作為一個Message對象發送到消息隊列中,然後,有Handler中的handlerMessage方法處理傳過來的數據信息,並操作UI。當然,Handler對象是在主線程中初始化的,以為它需要綁定在主線程的消息隊列中。
類sendMessage(Message msg)方法實現發送消息的操作。 在初始化Handler對象時重寫的handleMessage方法來接收Messgae並進行相關操作。
2. 傳遞Runnable對象。用於通過Handler綁定的消息隊列,安排不同操作的執行順序。
Handler對象在進行初始化的時候,會默認的自動綁定消息隊列。利用類post方法,可以將Runnable對象發送到消息隊列中,按照隊列的機制按順序執行不同的Runnable對象中的run方法。
Handler中分發消息的一些方法
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
Handler和多線程
post方法雖然發送的是一個實現瞭Runnable接口的類對象,但是它並非創建瞭一個新線程,而是執行瞭該對象中的run方法。也就是說,整個run中的操作和主線程處於同一個線程。
這樣對於那些簡單的操作,似乎並不會影響。但是對於耗時較長的操作,當它被加入到消息隊列中之後執行會占用很長的時間,以至於處於同一線程的其他操作無法繼續執行,就會出現“假死”。為瞭解決這個問題,就需要使得handler綁定到一個新開啟線程的消息隊列上,在這個處於另外線程的上的消息隊列中處理傳過來的Runnable對象和消息。
這樣,當使用sendMessage方法傳遞消息或者使用post方法傳遞Runnable對象時,就會把它們傳遞到與handler對象綁定的處於另外一個線程的消息隊列中,它們將在另外的消息隊列中被處理。而主線程還會在發送操作完成時候繼續進行,不會影響當前的操作。
這裡需要註意,這裡用到的多線程並非由Runnable對象開啟的,而是ThreadHandler對象開啟的。Runnable對象隻是作為一個封裝瞭操作的對象被傳遞,並未產生新線程。
handler的小例子
佈局很簡單就一個Textview主要是間隔一秒更新一下
[html]
<TextView
android:id="@+id/handlertest"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
實現的方法如下:
[java]
package com.nyist.wj;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.widget.TextView;
public class HandlerActivity extends Activity {
TextView handlertest;
Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 0:
Bundle bundle = msg.getData();
String str = bundle.getString("msg");
handlertest.setText(str);
break;
default:
break;
}
};
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
handlertest = (TextView) findViewById(R.id.handlertest);
new myThread(this).start();
}
public class myThread extends Thread {
int count;
HandlerActivity handlerActivity;
boolean flag = true;
public myThread(HandlerActivity handlerActivity) {
this.handlerActivity = handlerActivity;
}
public void run() {
while (flag) {
if (count >= 20) {
flag = false;
}
String message = "第" + (count++) + "次測試";
Bundle bundle = new Bundle();
bundle.putString("msg", message);
Message testMessage = new Message();
testMessage.setData(bundle);
testMessage.what = 0;
handlerActivity.handler.sendMessage(testMessage);
try {
Thread.sleep(1000);
} catch (Exception e) {
}
}
}
}
}
實現的結果如圖: