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

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

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

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

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

效果图如下:

    

    

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

package com.czm.updateui;

import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.R.integer;
import android.app.Activity;
import android.graphics.Color;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView; public class UpdateUIActivity extends Activity { private Button btnHandler;
private Button btnRunOnUiThread;
private Button btnAsyncTask;
private TextView tvHandler;
private TextView tvOnUiThread;
private TextView tvProgress;
private Handler uiHandler;
private ProgressBar progressBar; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.update_ui);
initViews();
setListeners();
}
private void initViews(){
btnHandler = (Button) findViewById(R.id.btnHandler);
btnRunOnUiThread = (Button) findViewById(R.id.btnRunOnUiThread);
btnAsyncTask = (Button)findViewById(R.id.btnAsyncTask);
tvHandler = (TextView) findViewById(R.id.tvText1);
tvOnUiThread = (TextView)findViewById(R.id.tvText2);
tvProgress = (TextView)findViewById(R.id.tvText3);
progressBar = (ProgressBar)findViewById(R.id.progressBar);
}
private void setListeners(){
uiHandler = new Handler(){ @Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
Bundle bundle = msg.getData();
String text = bundle.getString("handler_text");
String color = bundle.getString("handler_color"); tvHandler.setText(text);
tvHandler.setBackgroundColor(Color.BLUE); } };
//通过Handler机制来更新UI
btnHandler.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
new Thread(){ @Override
public void run() {
// TODO Auto-generated method stub
Message msg =new Message();
Bundle bundle = new Bundle();
bundle.putString("handler_text", "我是由Handler更新UI后的文案");
bundle.putString("handler_color", "#0000FF");
msg.setData(bundle);
//uiHandler.sendMessageDelayed(msg, 2000);
uiHandler.sendMessage(msg);
} }.start();
}
}); //通过RunOnUiThread来更新UI
btnRunOnUiThread.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub runOnUiThread(new Runnable() { @Override
public void run() {
// TODO Auto-generated method stub
tvOnUiThread.setText("我是由runOnUiThread更新UI后的文案");
tvOnUiThread.setBackgroundColor(Color.RED); }
});
}
});
//通过AsyncTask 异步任务来更新UI
btnAsyncTask.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
new MyAsyncTask().execute(0);
}
});
} private class MyAsyncTask extends AsyncTask<Integer, Integer, Integer>{ @Override
protected void onPostExecute(Integer result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
tvProgress.setText("加载完成...100%");
} @Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
progressBar.setProgress((int)(values[0]));
tvProgress.setText("加载中..."+values[0]+"%");
} @Override
protected Integer doInBackground(Integer... params) {
// TODO Auto-generated method stub
Integer timer = 0;
while(timer <=100){
try {
publishProgress(timer);
timer ++;
Thread.sleep(40);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
} } }

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center_horizontal"
tools:context=".UpdateUIActivity" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >"
<Button
android:id="@+id/btnHandler"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Handler" />
<Button
android:id="@+id/btnRunOnUiThread"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="runOnUiThread" />
<Button
android:id="@+id/btnAsyncTask"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="AsyncTask" />
</LinearLayout> <TextView
android:id="@+id/tvText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="Handler来更新UI"
android:padding="3dp"
android:textColor="#FFF"
android:background="#666666"
android:textSize="20dp" />
<TextView
android:id="@+id/tvText2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="RunOnUiThread来更新UI"
android:padding="3dp"
android:textColor="#FFF"
android:background="#666666"
android:textSize="20dp" /> <ProgressBar android:id="@+id/progressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="25dp"
android:progressDrawable="@drawable/progressbar"
android:max="100"
android:progress="0"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_marginTop="10dp"
/>
<TextView
android:id="@+id/tvText3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="准备加载...0%"
android:textSize="20dp" /> </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. Desert King

    poj2728:http://poj.org/problem?id=2728 题意:给你n的点,每一个点会有一个坐标(x,y),然后还有一个z值,现在上你求一棵生成树,是的这棵生成树的所有边的费用/所 ...

  2. mysql 连接url中useUnicode=true&characterEncoding=UTF-8 的作用

    添加的作用是:指定字符的编码.解码格式.            例如:mysql数据库用的是gbk编码,而项目数据库用的是utf-8编码.这时候如果添加了useUnicode=true&cha ...

  3. C#子线程更新UI控件的方法总结

    http://blog.csdn.net/jqncc/article/details/16342121 在winform C/S程序中经常会在子线程中更新控件的情况,桌面程序UI线程是主线程,当试图从 ...

  4. ANDROID_MARS学习笔记_S04_002_用AsyncTask实现异步操作

    一.简介 二.代码1.xml(1)activity_main.xml <?xml version="1.0" encoding="utf-8"?> ...

  5. user模式下编译android 代码被proguard优化导致类和变量丢失

    在Android项目中用到JNI,当用了proguard后,发现native方法找不到很多变量,原来是被produard优化掉了.所以,在JNI应用中该慎用progurad啊. 解决办法: 1.在An ...

  6. SimpleDateFormat的线程安全问题

    做项目的时候查询的日期总是不对,花了很长时间才找到异常的根源,原来SimpleDateFormat是非线程安全的,当我把这个类放到多线程的环境下转换日期就会出现莫名奇妙的结果,这种异常找出来可真不容易 ...

  7. PLSQL调用webservice

      1.   用途简介 为什么要在Oracle中访问WebService?在系统实现中,有时会有直接在数据库端利用触发器.存储过程等方式进行数据传递.分发的业务,而其中可能会涉及一些业务逻辑,为了处理 ...

  8. 数据表列名与数据库关键字冲突,在Hibernate下的解决办法

    设计了一个数据库,某一个列名字是key,这与mysql数据库关键字冲突了,Hibernate下save总是报错. 在mysql命令中,解决办法很简单,只需要将关键字key用引号括起来就好了. 在Hib ...

  9. C# Read/Write another Process' Memory ZZ

    Today's tutorial is about...processes' memory! In this article I'll show you how to read/write a pro ...

  10. HDOJ/HDU 1982 Kaitou Kid - The Phantom Thief (1)(字符串处理)

    Problem Description Do you know Kaitou Kid? In the legend, Kaitou Kid is a master of disguise, and c ...