zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    Java方法
    Java流程控制
    Java基础
    常用Dos命令
    MarkDown语法
    怎样获取最新版的javascript文件,解决被浏览器缓存的问题
    笔记:javascript操作iframe内的DOM元素,及调用iframe内的方法
    .net程序部署(mono方式)
    面向对象的一点简易理解
    [李说新语]系列(1)西汉勇士贯高到底该不该死
  • 原文地址:https://www.cnblogs.com/JczmDeveloper/p/3829868.html
Copyright © 2011-2022 走看看