Android中用于耗时的一个程序分析(利用ProgressDialog)
2014-11-18 21:59
246 查看
今天写Android应用界面ProgressDialog时看了段模拟耗时程序想不明白,就仔细分析了一下发现真有些门道。
源码如下:
// 发送空消息到Handlerhandler.sendEmptyMessage(0x123);}// 如果任务已经完成if (progressStatus >= MAX_PROGRESS){// 关闭对话框pd2.dismiss();}}}.start();}// 模拟一个耗时的操作。public int doWork(){// 为数组元素赋值data[hasData++] = (int) (Math.random() * 100);try{Thread.sleep(100);}catch (InterruptedException
e){e.printStackTrace();}return hasData;}}
注意看他的模拟耗时操作
然后观察doWork的循环调用时根据progressStatus的大小来的,不理解上条语句的原因是对Java中的data.length和C中的sizeof()混淆。
length是直接返回数组大小的
length()是计算String的,返回字符串长度的
size()是计算集合包含元素的。
懂了这个就明白数组不会越界,但是数组的大小还是会影响程序调用Progress的时间的
例如:
先在doWork中加入输出hasDate到Log进行观察
数组大小为100
输出的值是1到100
将数组大小改为50
没有发生越界现象,但执行时间是100时候的一半。
源码如下:
package org.crazyit.ui; import android.app.Activity; import android.app.ProgressDialog; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; public class ProgressDialogTest extends Activity { final static int MAX_PROGRESS = 100; // 该程序模拟填充长度为100的数组 private int[] data = new int[50]; // 记录进度对话框的完成百分比 int progressStatus = 0; int hasData = 0; ProgressDialog pd1,pd2; // 定义一个负责更新的进度的Handler Handler handler = new Handler() { @Override public void handleMessage(Message msg) { // 表明消息是由该程序发送的。 if (msg.what == 0x123) { pd2.setProgress(progressStatus); } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void showProgress(View source) { // 将进度条的完成进度重设为0 progressStatus = 0; // 重新开始填充数组。 hasData = 0; pd2 = new ProgressDialog(ProgressDialogTest.this); pd2.setMax(MAX_PROGRESS); // 设置对话框的标题 pd2.setTitle("任务完成百分比"); // 设置对话框 显示的内容 pd2.setMessage("耗时任务的完成百分比"); // 设置对话框不能用“取消”按钮关闭 pd2.setCancelable(false); // 设置对话框的进度条风格 pd2.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); // 设置对话框的进度条是否显示进度 pd2.setIndeterminate(false); pd2.show(); //③ new Thread() { public void run() { while (progressStatus < MAX_PROGRESS) { <pre name="code" class="java">// 获取耗时操作的完成百分比 progressStatus = MAX_PROGRESS * doWork() / data.length;
// 发送空消息到Handlerhandler.sendEmptyMessage(0x123);}// 如果任务已经完成if (progressStatus >= MAX_PROGRESS){// 关闭对话框pd2.dismiss();}}}.start();}// 模拟一个耗时的操作。public int doWork(){// 为数组元素赋值data[hasData++] = (int) (Math.random() * 100);try{Thread.sleep(100);}catch (InterruptedException
e){e.printStackTrace();}return hasData;}}
注意看他的模拟耗时操作
// 该程序模拟填充长度为100的数组 private int[] data = new int[50];这面明明是长度为50的数组他为什么注释成100,引起了我的注意,如果真应该是100这里写成50,doWork()不会越界
// 获取耗时操作的完成百分比 progressStatus = MAX_PROGRESS * doWork() / data.length;
然后观察doWork的循环调用时根据progressStatus的大小来的,不理解上条语句的原因是对Java中的data.length和C中的sizeof()混淆。
length是直接返回数组大小的
length()是计算String的,返回字符串长度的
size()是计算集合包含元素的。
懂了这个就明白数组不会越界,但是数组的大小还是会影响程序调用Progress的时间的
例如:
先在doWork中加入输出hasDate到Log进行观察
public int doWork() { data[hasData++] = (int)(Math.random()*100); try { Thread.sleep(100); } catch(InterruptedException e) { e.printStackTrace(); } System.out.println(hasData);//加入输出 return hasData; }
数组大小为100
private int[]data = new int[100];
输出的值是1到100
将数组大小改为50
没有发生越界现象,但执行时间是100时候的一半。
相关文章推荐
- android一个很好的数据库基类,利用此类非常方便构建数据库操作类
- 【Android2D游戏开发十六】(上文之触摸屏手势)详解Android Gesture 手势操作!利用手势实现一个简单切换图片的功能!
- Android的NDK开发(2)————利用Android NDK编写一个简单的HelloWorld
- 利用ffmpeg和SDL实现一个跨android版本的音视频播放器
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- 利用C#反射为DO映射对象数组生成一个用于列表显示的通用解决方案
- 利用ffmpeg和SDL实现一个跨android版本的音视频播放器
- Android的NDK开发(2)————利用Android NDK编写一个简单的HelloWorld
- Android学习笔记(18)————利用tts开发一个android发音字典
- 利用ffmpeg和SDL实现一个跨android版本的音视频播放器
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- 【代码】利用Android的Log 演示一个activity的生命周期
- 一个android带可变图标以及checkbox的ListView的Adapter的实现,用于工厂测试
- Android的NDK开发(2)————利用Android NDK编写一个简单的HelloWorld
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- 16—【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- 一个用于导出android项目配置宏为单个独立xml文件的shell脚本
- (转)【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!