android更新主线程UI的两种方式handler与runOnUiThread()

1.android更新主线程UI的两种方式handler与runOnUiThread()

在android开发过程中,耗时操作我们会放在子线程中去执行,而更新UI是要主线程(也叫做:UI线程)来更新的,自然会遇到如何更新主线程UI的问题。如果在主线程之外的线程中直接更新页面显示常会报错。抛出异常:android.view.ViewRoot.CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

为什么要有handler机制?
handler的作用:与其他线程协同工作,接收其他线程的消息并通过接收到的消息更新主UI线程的内容。
handler的原理:
andriod提供了 Handler 和 Looper 来满足线程间的通信。Handler 先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(Message Exchange)。   
1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。 whille死循环  
2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper从Message Queue取出)所送来的消息。
3)Message Queue(消息队列):用来存放线程放入的消息。
4)线程:UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue。


只有原始创建这个视图层次(view hierachy)的线程才能修改它的视图(view)。话不多说,贴出更新主线程UI的两种方式handler与runOnUiThread()的实现代码。

2.Handler

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;

public class MainActivity extends Activity {

	protected static final int MSG_ONE = 1;
	protected static final int MSG_TWO = 2;
	
	private Handler handler = new Handler() {
		public void handleMessage(Message msg) {
			switch (msg.what) {
				case MSG_ONE:
					// 执行1的操作
					break;
				case MSG_TWO:
					// 执行2的操作
					break;
			};
		}
	};
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		// 耗时操作要在子线程中操作
		new Thread() {
			public void run() {
				Message message = Message.obtain(); //获取消息的载体

				if (condition) {
					message.what = MSG_ONE;
				} else {
					message.what = MSG_TWO;
				}
				handler.sendMessage(message);
			};
		}.start();
	}
	
}

3.runOnUiThread()

package com.itheima.zhbj;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		// 耗时操作要在子线程中操作
		new Thread() {
			public void run() {
				
				//执行耗时操作
				
				//更新主线程UI
				runOnUiThread(new Runnable() {
					@Override
					public void run() {
						
					}
				});
			};
		}.start();
	}
	
}

你可能感兴趣的:(handler,runOnUiThread,更新主线程UI)