zoukankan      html  css  js  c++  java
  • 使用runOnUiThread更新UI

    android中更新UI的方式比较多,这里就不一一介绍了,比较常用的Thread+Handler,但是这种方式较繁琐,如在使用ProgressDialog创建进度对话框 一文中就是使用的这种方式更新UI线程,下面介绍一种使用Activity的runOnUiThread方法来实现同样的功能,仍以此示例为例:

    MainActivity:

    package com.home.testrunonuithread;
    
    import android.app.Activity;
    import android.app.Dialog;
    import android.app.ProgressDialog;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    public class MainActivity extends Activity {
    	// 该程序模拟填充长度为100的数组
    	private int[] data = new int[100];
    	private int hasData = 0;
    	// 定义进度对话框的标识
    	private final int PROGRESS_DIALOG = 0x112;
    	// 记录进度对话框完成的百分比
    	private int progressStatus = 0;
    	// 定义一个进度对话框对象
    	private ProgressDialog pd;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
    		Button btn = (Button) findViewById(R.id.btn1);
    		btn.setOnClickListener(new OnClickListener() {
    
    			@Override
    			public void onClick(View v) {
    				progressStatus = 0;
    				hasData = 0;
    				// 显示指定对话框
    				showDialog(PROGRESS_DIALOG);
    			}
    		});
    	}
    
    	// 创建对话框
    	@Override
    	protected Dialog onCreateDialog(int id, Bundle args) {
    		switch (id) {
    		case PROGRESS_DIALOG:
    			// 创建进度对话框
    			pd = new ProgressDialog(this);
    			pd.setMax(100);
    			// 设置对话框标题
    			pd.setTitle("任务完成百分比");
    			// 设置对话框显示的内容
    			pd.setMessage("下载完成的百分比");
    			// 设置对话框不能用取"消按"钮关闭
    			pd.setCancelable(false);
    			// 设置对话框的进度条风格
    			// pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    			pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    			// 设置对话框的进度条是否显示进度
    			pd.setIndeterminate(false);
    			break;
    		}
    		return pd;
    	}
    
    	// 该方法将在onCreateDialog调用后被回调
    	@Override
    	protected void onPrepareDialog(int id, Dialog dialog) {
    
    		super.onPrepareDialog(id, dialog);
    		switch (id) {
    		case PROGRESS_DIALOG:
    			// 对话框进度清零
    			pd.incrementProgressBy(-pd.getProgress());
    			new Thread() {
    				public void run() {
    					while (progressStatus < 100) {
    						// 获取耗时任务完成的百分比
    						progressStatus = doWork();
    						// 运行于UI线程
    						runOnUiThread(new Runnable() {
    
    							@Override
    							public void run() {
    								// 设置进度条的进度
    								pd.setProgress(progressStatus);
    							}
    						});
    					}
    					// 如果任务已经完成
    					if (progressStatus >= 100) {
    						// 关闭对话框
    						pd.dismiss();
    					}
    				}
    
    			}.start();
    			break;
    		}
    	}
    
    	/**
    	 * 模拟一个耗时的操作
    	 * 
    	 * @return
    	 */
    	public int doWork() {
    		// 为数组元素赋值
    		data[hasData++] = (int) (Math.random() * 100);
    		try {
    			Thread.sleep(100);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		return hasData;
    	}
    }

    布局文件只有一个按钮不再给出。

    runOnUiThread的源码可以看出:

    public final void runOnUiThread(Runnable action) {
            if (Thread.currentThread() != mUiThread) {
                mHandler.post(action);
            } else {
                action.run();
            }
        }


    程序首先会判断当前线程是否是UI线程,如果是就直接运行,如果不是则post,这时其实质还是使用的Handler机制来处理线程与UI通讯。

    但这个方法,在处理一些简要的更新UI操作时(比如更新adapter等),显得更简洁、方便。

  • 相关阅读:
    sap快捷登录
    转载(略有修改):Windows 8的承载网络设置方法(w8 创建无线网络/ap)
    转载:Keytool 工具介绍
    minecraft初探
    linux图像界面连接-xdm
    经典的始终经典(牛蛙)
    vmware install win8 and server2012 problem
    windows硬盘优化篇
    网络15软工个人作业5——软件工程总结
    个人作业4——alpha阶段个人总结
  • 原文地址:https://www.cnblogs.com/riasky/p/3508680.html
Copyright © 2011-2022 走看看