`
wangleyiang
  • 浏览: 218906 次
社区版块
存档分类
最新评论

Android UI更新

阅读更多

Android应用程序通常运行在一个dalvik虚拟机进程中,进程开始的时候会启动一个主线程(MainThread),主线程负责处理和UI相关的事件,如:用户的按键事件,因此主线程通常又叫UI线程。而由于Android采用UI单线程模型,所以只能在主线程中对UI元素进行操作。如果在非UI线程直接对UI进行了操作,则会报错:CalledFromWrongThreadException:only the original thread that created a view hierarchy can touch its views。

Android提供了消息循环的机制,利用这个机制可以实现线程间的通信,从而达到更新UI的操作。

为了保证UI线程能够及时响应用户的操作,应尽量避免在UI线程中进行费时操作。如果UI线程被阻塞5秒,则系统会弹出ANR对话框,等待用户进一步操作。

Message Queue是一个消息队列,用来存放通过Handler发送的消息。Android在第一启动程序时会默认会为UI thread创建一个关联的消息队列,可以通过Looper.myQueue()得到当前线程的消息队列,用来管理程序的一些上层组件,activities,broadcast receivers 等,你可以在自己的子线程中创建Handler与UI thread通讯。

Handler会向message queue通过两种方法发送消息:send或post。这两种消息都会插在message queue队尾并按先进先出执行,但通过这两种方法发送的消息执行的方式略有不同:1)通过send发送的是一个message对象, 会被handler的 handleMessage()函数处理;2)而通过post方法发送的是一个runnable对象,则会自己执行。

UI线程图形界面中的view可通过post方法向GUI线程的message queue投递一个runnable。对于除UI线程以外的其他线程,创建时缺省并没有message queue,而对于UI线程,则可以直接(比如在onCreate)创建一个handler并重载handleMessage,省去创建message queue的过程。

 

如果在UI线程中,把费时操作放到新开启的线程中,当操作完成时,通过Handler来统一对相关UI进行更新,这是一个可行且易于理解的处理方法。

 

代码结构如下:

public class RefreshUIActivity extends Activity implements OnClickListener {
    
	private static final int ACTION_BUTTON_1 = 1;
	private static final int ACTION_BUTTON_2 = 2;
	private static final int ACTION_BUTTON_3 = 3;
	
	private Button button1;
	private Button button2;
	private Button button3;
	
	private Handler mHandler = new Handler(new Callback() {
		
		@Override
		public boolean handleMessage(Message msg) {
			switch (msg.what) {
			case ACTION_BUTTON_1:
				button1.setText("Button1 " + msg.what);
				break;
			case ACTION_BUTTON_2:
				button2.setText("Button2 " + msg.what);
				break;
			case ACTION_BUTTON_3:
				button3.setText("Button3 " + msg.what);
				break;
			default:
				break;
			}
			return false;
		}
	});
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        button1 = (Button) findViewById(R.id.button1);
        button2 = (Button) findViewById(R.id.button2);
        button3 = (Button) findViewById(R.id.button3);
        
        button1.setOnClickListener(this);
        button2.setOnClickListener(this);
        button3.setOnClickListener(this);
        
    }

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.button1:
	        handleButton1();
			break;
		case R.id.button2:
			handleButton2();
			break;
		case R.id.button3:
			handleButton3();
			break;
		default:
			break;
		}
	}

	private void handleButton3() {
		
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				
				try {
					Thread.sleep(3 * 1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				
				mHandler.sendEmptyMessage(ACTION_BUTTON_3);
				
			}
		}).start();
		
	}

	private void handleButton2() {
		
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				
				try {
					Thread.sleep(3 * 1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				
				mHandler.sendEmptyMessage(ACTION_BUTTON_2);
				
			}
		}).start();
		
	}

	private void handleButton1() {
		
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				
				try {
					Thread.sleep(3 * 1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				
				mHandler.sendEmptyMessage(ACTION_BUTTON_1);
				
			}
		}).start();
		
	}

}

 

说明:上面仅仅是个人喜欢的代码结构罢了,呵呵!

 

多说一句:当然还有其它的机制可以完成更新UI的操作,在此不再赘述!=^_^=

 

 

 

分享到:
评论

相关推荐

    详解Android UI更新的几种方法

    Android UI更新方法详解 Android UI更新是 Android 应用程序开发中一个非常重要的步骤。在 Android 开发中,界面 UI 的更新都是在主线程来完成的。线程分为主线程(Main Thread,简称 MT)和工作线程(WorkThread...

    Android UI控件组件库集合【源码】

    在Android开发中,UI设计是至关重要的一环,它直接影响到应用程序的用户体验。这个"Android UI控件组件库集合【源码】"提供了多种常用的UI控件及其源代码,旨在帮助开发者构建更加美观、功能丰富的应用界面。下面...

    《Android UI设计》PDF

    《Android UI设计》面向创建移动应用的产品经理、设计师和开发者,系统讲解了从事Android UI设计必须要掌握的Android平台的主要技术和特性,全面总结了Android UI的设计原理、设计理念和设计模式,并通过一个综合的...

    androidUI设计器

    尽管现在DroidDraw已经不再更新,但对于初学者来说,它仍然是一个了解Android UI设计概念的有用资源。 总之,Android UI设计器是Android应用开发中不可或缺的一部分,它简化了UI设计过程,使开发者可以专注于用户...

    通过Messenger实现Android Service更新UI

    在某些情况下,我们可能需要一个Service去执行一些任务,并在任务完成后更新UI。这时,我们可以利用Android的Binder机制中的Messenger来实现这种跨进程通信(IPC,Inter-Process Communication)。本篇将详细介绍...

    Android广播onReceiver回调更新ui

    通常,我们推荐使用Handler或AsyncTask来异步处理UI更新。在主线程(UI线程)中更新UI,确保操作的顺利进行。 5. **测试广播接收器**: 文件名为"testbroadcast"可能是一个用于测试广播接收器的类或项目。测试广播...

    Android UI 生成器

    android UI 生成器 可以生成android的UI减轻工作,比eclipse内置的好多了,直接生成布局文件拉人项目直接使用

    Android UI基础教程 高清带标签pdf

     《AndroidUI基础教程》是一本Android用户界面设计的基础入门图书。全书从最基础的技术概念开始介绍,深入讨论了UI设计的各项技术,涵盖了为应用程序创建UI的所有内容。本书不仅会告诉读者创建灵活布局的最佳方法,...

    android UI界面开发图片

    在Android平台上进行UI界面开发时,图片资源是至关重要的元素,它们不仅决定了应用的视觉吸引力,也直接影响用户体验。本文将围绕“Android UI界面开发图片”这一主题,深入探讨相关知识点,帮助开发者创建出美观且...

    android UI设计技巧

    随着Android版本的更新,新的设计模式不断涌现。例如,BottomNavigationView提供了底部导航,使得多页面应用更易于操作。悬浮动作按钮(FloatingActionButton)为用户提供快速执行主要操作的入口。使用Jetpack Compose...

    android UI 各种小例子

    在Android中,由于主线程不能进行耗时操作,所以通常会用到AsyncTask或Handler/Looper机制来在后台线程处理数据,并在UI线程上更新界面。 2. **UI-LinearLayout**: LinearLayout是Android中最基础的布局管理器之...

    android ui基础教程

    ### Android UI基础教程知识点概述 #### 一、Android UI基础知识 **1.1 Android UI简介** Android UI(用户界面)是Android应用程序与用户交互的主要方式。一个良好的UI设计能够极大地提升用户体验,使得用户更...

    AndroidUI界面开发规范

    ### AndroidUI界面开发规范 #### 一、引言 随着移动设备的普及和发展,用户界面(UI)设计在软件开发中的重要性日益凸显。一个良好的UI不仅能够提升用户体验,还能够帮助开发者更好地传达产品理念。本篇文章将从...

    Android UI试练 微信UIDemo

    在Android开发领域,UI设计是至关重要的一环,它直接影响到应用的用户体验和整体质感。"Android UI试练 微信UIDemo"是一个专为开发者准备的学习资源,旨在帮助他们掌握和模仿微信应用的用户界面设计。这个项目不仅...

    android UI大全

    学习如何定制它们的样式、监听用户交互和动态更新内容是Android UI开发的关键。 2. **布局管理器**:Android提供了多种布局,如LinearLayout、RelativeLayout、ConstraintLayout、GridLayout等,用于组织和定位应用...

    android UI界面设计

    Android UI 界面设计 Android UI 界面设计是一种基于 Android 平台的用户界面设计方法,旨在为用户提供简洁、美观、易用的界面设计体验。下面是 Android UI 界面设计的相关知识点: 一、UI 设计 9 要素 1. 为高...

    android UI定制的一些资料

    Android提供Property Animation和View Animation两种机制,前者用于改变对象属性并实时更新,后者则适用于简单的移动和变形效果。学习并掌握这些动画技术,能使应用的交互更具生动性。 最后,无障碍性和国际化也是...

Global site tag (gtag.js) - Google Analytics