您的位置:首页 > 移动开发 > Android开发

Android中用于耗时的一个程序分析(利用ProgressDialog)

2014-11-18 21:59 246 查看
今天写Android应用界面ProgressDialog时看了段模拟耗时程序想不明白,就仔细分析了一下发现真有些门道。

源码如下:

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时候的一半。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐