Android开发之UI更新交互机制与实例解析

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更新交互机制与实例解析,布布扣,bubuko.com

时间: 2024-12-17 10:45:30

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

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

一.IPC进程间通信 IPC是进程间通信方法的统称,Linux IPC包括以下方法,Android的进程间通信主要采用是哪些方法呢? 1. 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信:   2. 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身:linux除了支持Unix早期

Android开发之Touch事件分发机制

原地址http://www.cnblogs.com/linjzong/p/4191891.html Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实上是调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理. View在ViewGroup内,ViewGroup也可以在其他ViewGroup内,这时候把内部的ViewGroup当成View来分析. ViewGroup的相关事件有三个:onInterceptTouchEv

Android开发之Fragment详解

Android开发之Fragment学习 1.简介: Fragment是Android 3.0引入的新API. Fragment代表了 Activity的子模块,因此可以把Fragment理解成Activity片段.Fragment用于自己的生命周期,也可以接受它自己的输入事件. Fragment必须被"嵌入" Activity中使用,因此虽然Fragment也拥有自己的生命周期,但Fragment的生命周期会受它所在的Activity的生命周期的控制.例如,当Activity暂停时,

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

在Android开发之bindService()通信的基础上,实现bindService()方法侦听service内部状态. 实现侦听service内部状态,使用的是回调机制 1.首先实现一个接口 1 public static interface CallBack{ 2 void onDataChange(String data); 3 } 2. 1 private CallBack callBack=null; 2 public void setCallBack(CallBack callB

Android开发之InstanceState详解

Android开发之InstanceState详解 本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceState(),并且在介绍这两个方法之后,再分别来实现使用InstanceState保存和恢复数据功能.Android实现屏幕旋转异步下载效果这样两个示例. 首先来介绍onSaveInstanceState() 和 onRestoreInstanceState() .关于这两个方法,一些朋友可能在Andr

【转】Android开发之旅:应用程序基础及组件

为了后面的例子做准备,本篇及接下来几篇将介绍Android应用程序的原理及术语,这些也是作为一个Android的开发人员必须要了解,且深刻理解的东西.本篇的主题如下: 1.应用程序基础 2.应用程序组件 2.1.活动(Activities) 2.2.服务(Services) 2.3.广播接收者(Broadcast receivers) 2.4.内容提供者(Content providers) 因为这些内容比较理论,且没有用例子来说明,看上去会比较枯燥,我就把这几篇写得算比较短,方便大家吸收. 1

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

Android开发之InstanceState详解 本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceState(),并且在介绍这两个方法之后,再分别来实现使用InstanceState保存和恢复数据功能.Android实现屏幕旋转异步下载效果这样两个示例. 首先来介绍onSaveInstanceState() 和 onRestoreInstanceState() .关于这两个方法,一些朋友可能在Andr

Android开发之Handler和Looper的关系

关于Handler的总结. Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理. Handler:处理者,负责Message的发送及处理.使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等. MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照FIFO规则执行.当然,存放Message并非实际意义的保存,而

Android开发之WebView详解

概述: 一个显示网页的视图.这个类是你可以滚动自己的Web浏览器或在你的Activity中简单地显示一些在线内容的基础.它使用了WebKit渲染引擎来显示网页,包括向前和向后导航的方法(通过历史记录),放大和缩小,执行文本搜索等. 需要注意的是:为了让你的应用能够使用WebView访问互联网和加载网页,你必须添加Internet的权限在Android Manifest文件中: <uses-permission android:name="android.permission.INTERNE