android开发过程中,经常需要更新UI的状态和文案等。这是就需要对UI进行 更新。在android中更新UI一般有三种方法,handler机制、RunOnUiThread方法以及AsyncTask异步类方法等

本文下面就这三种方法进行了演示和代码实现.

a.Handler机制通过使用消息机制来实现

b.RunOnUiThread方法是通过运行UI线程来达到更新UI的目的

c.AsyncTask是异步类,通过异步更新来更新UI

效果图如下:

    

    

(1)Java功能实现代码如下:

  1. package com.czm.updateui;
  2.  
  3. import android.os.AsyncTask;
  4. import android.os.Bundle;
  5. import android.os.Handler;
  6. import android.os.Message;
  7. import android.R.integer;
  8. import android.app.Activity;
  9. import android.graphics.Color;
  10. import android.view.View;
  11. import android.view.View.OnClickListener;
  12. import android.widget.Button;
  13. import android.widget.ProgressBar;
  14. import android.widget.TextView;
  15.  
  16. public class UpdateUIActivity extends Activity {
  17.  
  18. private Button btnHandler;
  19. private Button btnRunOnUiThread;
  20. private Button btnAsyncTask;
  21. private TextView tvHandler;
  22. private TextView tvOnUiThread;
  23. private TextView tvProgress;
  24. private Handler uiHandler;
  25. private ProgressBar progressBar;
  26.  
  27. @Override
  28. protected void onCreate(Bundle savedInstanceState) {
  29. super.onCreate(savedInstanceState);
  30. setContentView(R.layout.update_ui);
  31. initViews();
  32. setListeners();
  33. }
  34. private void initViews(){
  35. btnHandler = (Button) findViewById(R.id.btnHandler);
  36. btnRunOnUiThread = (Button) findViewById(R.id.btnRunOnUiThread);
  37. btnAsyncTask = (Button)findViewById(R.id.btnAsyncTask);
  38. tvHandler = (TextView) findViewById(R.id.tvText1);
  39. tvOnUiThread = (TextView)findViewById(R.id.tvText2);
  40. tvProgress = (TextView)findViewById(R.id.tvText3);
  41. progressBar = (ProgressBar)findViewById(R.id.progressBar);
  42. }
  43. private void setListeners(){
  44. uiHandler = new Handler(){
  45.  
  46. @Override
  47. public void handleMessage(Message msg) {
  48. // TODO Auto-generated method stub
  49. super.handleMessage(msg);
  50. Bundle bundle = msg.getData();
  51. String text = bundle.getString("handler_text");
  52. String color = bundle.getString("handler_color");
  53.  
  54. tvHandler.setText(text);
  55. tvHandler.setBackgroundColor(Color.BLUE);
  56.  
  57. }
  58.  
  59. };
  60. //通过Handler机制来更新UI
  61. btnHandler.setOnClickListener(new OnClickListener() {
  62.  
  63. @Override
  64. public void onClick(View v) {
  65. // TODO Auto-generated method stub
  66. new Thread(){
  67.  
  68. @Override
  69. public void run() {
  70. // TODO Auto-generated method stub
  71. Message msg =new Message();
  72. Bundle bundle = new Bundle();
  73. bundle.putString("handler_text", "我是由Handler更新UI后的文案");
  74. bundle.putString("handler_color", "#0000FF");
  75. msg.setData(bundle);
  76. //uiHandler.sendMessageDelayed(msg, 2000);
  77. uiHandler.sendMessage(msg);
  78. }
  79.  
  80. }.start();
  81. }
  82. });
  83.  
  84. //通过RunOnUiThread来更新UI
  85. btnRunOnUiThread.setOnClickListener(new OnClickListener() {
  86.  
  87. @Override
  88. public void onClick(View v) {
  89. // TODO Auto-generated method stub
  90.  
  91. runOnUiThread(new Runnable() {
  92.  
  93. @Override
  94. public void run() {
  95. // TODO Auto-generated method stub
  96. tvOnUiThread.setText("我是由runOnUiThread更新UI后的文案");
  97. tvOnUiThread.setBackgroundColor(Color.RED);
  98.  
  99. }
  100. });
  101. }
  102. });
  103. //通过AsyncTask 异步任务来更新UI
  104. btnAsyncTask.setOnClickListener(new OnClickListener() {
  105.  
  106. @Override
  107. public void onClick(View v) {
  108. // TODO Auto-generated method stub
  109. new MyAsyncTask().execute(0);
  110. }
  111. });
  112. }
  113.  
  114. private class MyAsyncTask extends AsyncTask<Integer, Integer, Integer>{
  115.  
  116. @Override
  117. protected void onPostExecute(Integer result) {
  118. // TODO Auto-generated method stub
  119. super.onPostExecute(result);
  120. tvProgress.setText("加载完成...100%");
  121. }
  122.  
  123. @Override
  124. protected void onProgressUpdate(Integer... values) {
  125. // TODO Auto-generated method stub
  126. super.onProgressUpdate(values);
  127. progressBar.setProgress((int)(values[0]));
  128. tvProgress.setText("加载中..."+values[0]+"%");
  129. }
  130.  
  131. @Override
  132. protected Integer doInBackground(Integer... params) {
  133. // TODO Auto-generated method stub
  134. Integer timer = 0;
  135. while(timer <=100){
  136. try {
  137. publishProgress(timer);
  138. timer ++;
  139. Thread.sleep(40);
  140. } catch (InterruptedException e) {
  141. // TODO Auto-generated catch block
  142. e.printStackTrace();
  143. }
  144. }
  145. return null;
  146. }
  147.  
  148. }
  149.  
  150. }

(2)对应的UI布局xml文件代码:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical"
  6. android:gravity="center_horizontal"
  7. tools:context=".UpdateUIActivity" >
  8. <LinearLayout
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content"
  11. android:orientation="horizontal" >"
  12. <Button
  13. android:id="@+id/btnHandler"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:text="Handler" />
  17. <Button
  18. android:id="@+id/btnRunOnUiThread"
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:text="runOnUiThread" />
  22. <Button
  23. android:id="@+id/btnAsyncTask"
  24. android:layout_width="wrap_content"
  25. android:layout_height="wrap_content"
  26. android:text="AsyncTask" />
  27. </LinearLayout>
  28.  
  29. <TextView
  30. android:id="@+id/tvText1"
  31. android:layout_width="wrap_content"
  32. android:layout_height="wrap_content"
  33. android:layout_marginTop="10dp"
  34. android:text="Handler来更新UI"
  35. android:padding="3dp"
  36. android:textColor="#FFF"
  37. android:background="#666666"
  38. android:textSize="20dp" />
  39. <TextView
  40. android:id="@+id/tvText2"
  41. android:layout_width="wrap_content"
  42. android:layout_height="wrap_content"
  43. android:layout_marginTop="10dp"
  44. android:text="RunOnUiThread来更新UI"
  45. android:padding="3dp"
  46. android:textColor="#FFF"
  47. android:background="#666666"
  48. android:textSize="20dp" />
  49.  
  50. <ProgressBar android:id="@+id/progressBar"
  51. style="?android:attr/progressBarStyleHorizontal"
  52. android:layout_width="fill_parent"
  53. android:layout_height="25dp"
  54. android:progressDrawable="@drawable/progressbar"
  55. android:max="100"
  56. android:progress="0"
  57. android:layout_marginLeft="5dp"
  58. android:layout_marginRight="5dp"
  59. android:layout_marginTop="10dp"
  60. />
  61. <TextView
  62. android:id="@+id/tvText3"
  63. android:layout_width="wrap_content"
  64. android:layout_height="wrap_content"
  65. android:text="准备加载...0%"
  66. android:textSize="20dp" />
  67.  
  68. </LinearLayout>

Android开发之UI更新交互机制与实例解析的更多相关文章

  1. Android开发之IPC进程间通信-AIDL介绍及实例解析

    一.IPC进程间通信 IPC是进程间通信方法的统称,Linux IPC包括以下方法,Android的进程间通信主要采用是哪些方法呢? 1. 管道(Pipe)及有名管道(named pipe):管道可用 ...

  2. Android开发之UI的编程方式创建

    我们知道,android中一个activity对应一个xml的UI配置文件,除了用xml文件配置的方式创建用户界面外,还可以使用代码编程的方式来创建一个用户界面.如果用户界面需要在运行过程中动态生成的 ...

  3. Android开发之Touch事件分发机制

    原地址http://www.cnblogs.com/linjzong/p/4191891.html Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实 ...

  4. 【Android UI】Android开发之View的几种布局方式及实践

    引言 通过前面两篇: Android 开发之旅:又见Hello World! Android 开发之旅:深入分析布局文件&又是“Hello World!” 我们对Android应用程序运行原理 ...

  5. Android开发之InstanceState详解

    Android开发之InstanceState详解   本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...

  6. Android开发之bindService()侦听service内部状态

    在Android开发之bindService()通信的基础上,实现bindService()方法侦听service内部状态. 实现侦听service内部状态,使用的是回调机制 1.首先实现一个接口 p ...

  7. Android开发之InstanceState详解(转)---利用其保存Activity状态

    Android开发之InstanceState详解   本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...

  8. Android开发之旅4:应用程序基础及组件

    引言 为了后面的例子做准备,本篇及接下来几篇将介绍Android应用程序的原理及术语,这些也是作为一个Android的开发人员必须要了解,且深刻理解的东西.本篇的主题如下: 1.应用程序基础 2.应用 ...

  9. Android开发之旅: Intents和Intent Filters(理论部分)

    引言 大部分移动设备平台上的应用程序都运行在他们自己的沙盒中.他们彼此之间互相隔离,并且严格限制应用程序与硬件和原始组件之间的交互. 我们知道交流是多么的重要,作为一个孤岛没有交流的东西,一定毫无意义 ...

随机推荐

  1. 【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!【2012-12-11日更新获取”产品付费数量等于0的问题”】

    转的别人的 看到很多童鞋问到,为什么每次都返回数量等于0?? 其实有童鞋已经找到原因了,原因是你在 ItunesConnect 里的 “Contracts, Tax, and Banking”没有完成 ...

  2. maven 根据不同的环境打war包-->资源文件的处理方式

    发现犯的错误: 1. 指定了testResource 文件夹与resource 为同一个文件夹.导致不论在resource 里面如何过滤文件,都不起作用.资源文件本来就是共享的.不必这样指定. 2. ...

  3. PYTHON小CASE

    import os import time source = ['C:\\py\\', 'C:\\work\\'] target_dir = 'C:\\backup' today = target_d ...

  4. VLAN间单臂路由访问

    实验书上的拓朴图: 注意TRUNK端口和路由器子端口设置,可以承载不同的VLAN标签. 交换机(用2691加交换模块实现的): Building configuration... Current co ...

  5. 李洪强iOS开发Swift篇—10_方法

    李洪强iOS开发Swift篇—10_方法 一.简单说明 跟其他面向对象语言一样,Swift中的方法可以分为2大类: (1)实例方法(Instance Methods) 在OC中,实例方法以减号(-)开 ...

  6. Best Practices for Using Alpha

    Alpha是图形界面开发中常用的特效,通常我们会使用以下代码来实现Alpha特效: view.setAlpha(0.5f); View.ALPHA.set(view, 0.5f); ObjectAni ...

  7. 17.1.1.1 Setting the Replication Master Configuration 设置复制的master 配置:

    17.1.1.1 Setting the Replication Master Configuration 设置复制的master 配置: 在一个复制master,你必须启用binary loggin ...

  8. poj1741 bzoj2152

    树分治入门 poj1741是男人八题之一,经典的树分治的题目这里用到的是点分治核心思想是我们把某个点i作为根,把路径分为过点i和不过点i先统计过点i这样的路径数,然后在统计其子树中的答案,这样就不断地 ...

  9. 如何删除MyEclipse(eclipse)中不需要的workspace

    在安装目录下,打开eclipse/configuration/.settings,用记事本打开org.eclipse.ui.ide.prefs文件 #Wed Mar 11 14:41:21 CST 2 ...

  10. Binomial Showdown

    Binomial Showdown TimeLimit: 1 Second   MemoryLimit: 32 Megabyte Totalsubmit: 2323   Accepted: 572 D ...