Android之Handler

我叫阿狸貓發表於2014-02-09
Handler
    1.什麼是Handler
                Android手機中只能在建立View的執行緒中才能修改View中的資料
                在某些情況下, 主執行緒建立了一個View, 我們要修改View中的資料, 而這時資料只有新執行緒才能獲取到.
                                主執行緒可以修改, 但沒有資料
                                新執行緒有資料, 但不能修改
                這時就可以用Handler來解決
                                新執行緒把資料傳送到主執行緒

                                主執行緒接收資料, 修改VIew

  2.Handler的使用

                如果需要在新執行緒中和主執行緒通訊, 那麼可以先在主執行緒中建立一個Handler, 把Handler的引用傳遞給新執行緒
                sendMessage:
                                在新執行緒中呼叫sendMessage()方法, 傳入一個Message物件.
                                這時建立Handler的執行緒就會執行handleMessage()方法, 得到那個Message物件
                post:
                                在新執行緒中呼叫post()方法, 傳入一個Runnable物件.

                                這時建立Handler的執行緒就會執行Runnable的run()方法.


例子:

介面中有TextView和Button兩個元件。

當點選Button的時候,讓TextView的數字自增。

注意:改變TextView的操作必須在新執行緒中完成。因為所有操作都在主執行緒中執行,一旦有延遲,介面就卡住了,而在新執行緒中執行就可以避免這種情況的發生。



使用sendMessage

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {
    private TextView numET;
    private int count = 10;
    private Handler handler = new Handler(){
    	public void handleMessage(Message msg) {//當呼叫handler的sendMessage(msg)時,handleMessage(Message msg)就會執行
    		switch (msg.what) {//判斷Message的識別符號
			case 1:
				String num = msg.getData().getString("num");
				numET.setText(num);
				break;
			}
    	}
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        numET = (TextView) findViewById(R.id.numTV);
    }
    
    public void add(View view) throws InterruptedException{
    	new Thread(){
    		public void run() {
    			Message msg = new Message();//建立一個訊息物件
    			msg.getData().putString("num",++count+"");//獲取訊息物件中存放資料的一個Map集合,儲存資料
    			msg.what = 2;//這個是用於區分多個Message的識別符號
				handler.sendMessage(msg);//傳送訊息到建立Handler的執行緒,那個執行緒就會自動執行handlerMessage()方法
    		};
    	}.start();
    }
}

使用post

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {
    private TextView numET;
    private int count = 3;
    private Handler handler = new Handler();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        numET = (TextView) findViewById(R.id.numTV);
    }
    
    public void add(View view) throws InterruptedException{
    	new Thread(){
    		public void run() {
    			handler.post(new Runnable() {//在新執行緒中傳送一個Runnable給建立Handler的執行緒,建立Handler的執行緒就會執行Runnable中的run方法
					public void run() {
						numET.setText(++count+"");
					}
				});
    		};
    	}.start();
    }
}



相關文章