Android中的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方法。

分發消息方法

post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable,long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
Android中的Handler機制

public class HandlerTestActivity extends Activity {
	private TextView tv;
	private static final int UPDATE = 0;
	private Handler handler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			// TODO 接收消息並且去更新UI線程上的控件內容
			if (msg.what == UPDATE) {
				// Bundle b = msg.getData();
				// tv.setText(b.getString("num"));
				tv.setText(String.valueOf(msg.obj));
			}
			super.handleMessage(msg);
		}
	};

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		tv = (TextView) findViewById(R.id.tv);

		new Thread() {
			@Override
			public void run() {
				// TODO 子線程中通過handler發送消息給handler接收,由handler去更新TextView的值
				try {
					for (int i = 0; i < 100; i++) {
						Thread.sleep(500);
						Message msg = new Message();
						msg.what = UPDATE;
						// Bundle b = new Bundle();
						// b.putString("num", "更新後的值:" + i);
						// msg.setData(b);
						msg.obj = "更新後的值:" + i;
						handler.sendMessage(msg);
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}.start();
	}

}

發佈留言