Android深入浅出系列之实例应用—程序运行进度提示条应用ProgressBar和Handler的使用
前言
Android里的很多控件,有许多是为了与用户进行交互的,也有一些是为了作为程序提示,显示程序运行状态的。在这里我们介绍一下ProgressBar控件的使用,它就是作为显示程序运行状态存在的。
思路
在这个应用一开始是看不到进度条的,我们布局一个按钮,然后单击这个按钮,再然后我们创建一个新的进程来假装程序很”忙碌“,可以在进程当中取得运行时的进度,在运行过程中,将运行的进度通过TextView显示出来。
因为这个进程是新开启的,新开启的进程无法访问Activity里的控件,也就无法把运行状态传递出来,所以我们要通过Handler和Message对象将新开启的进程里的状态传递出来,最后由Activity的Handler事件接收取得的运行状态。
实现步骤
一:布局文件编写
1.1:布局文件main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
android:id="@+id/tv"
/>
<ProgressBar
android:id="@+id/pb"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:max="200"
android:visibility="gone"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="运行进程"
android:id="@+id/btn"
/>
</LinearLayout>
二:代码文件编写
2. 1:MainActivity.java
package com.menglin.progressbarandhandler;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
public class MainActivity extends Activity
{
//自定义Handler信息代码,用以作为识别事件处理
protected static final int GUI_STOP_NOTIFIER = 0;
protected static final int GUI_THREADING_NOTIFIER = 1;
//声明一个Button对象btn
private Button btn;
//声明一个TextView对象tv
private TextView tv;
//声明一个ProgressBar对象pb
private ProgressBar pb;
//进度条计数器
private int intCount = 0;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//加载布局文件main.xml
setContentView(R.layout.main);
//通过findViewById()方法得到Button对象
btn = (Button)findViewById(R.id.btn);
//通过findViewById()方法得到TextView对象
tv = (TextView)findViewById(R.id.tv);
//通过findViewById()方法得到ProgressBar对象
pb = (ProgressBar)findViewById(R.id.pb);
//调用setIndeterminate()方法Indeterminate赋值为false,我们翻阅Android的SDK得到以下信息,Change the indeterminate mode for this progress bar 意思是说以不确定的方式改变这个进度条,也就是说可以改变进度条的指示
pb.setIndeterminate(false);
//给按钮绑定单击事件
btn.setOnClickListener(listener);
}
//定义匿名Handler内部类用来处理从消息队列中取出的消息
Handler MessageHandler = new Handler()
{
//当从消息队列中取出消息对象会自动调用此方法
public void handleMessage(Message message)
{
switch (message.what)
{
//当离开进程时
case MainActivity.GUI_STOP_NOTIFIER:
//设置TextView的文本信息为“运行进程完毕”
tv.setText(R.string.end);
//将ProgressBar设置为可为不可见
pb.setVisibility(View.GONE);
//终止当前的线程
Thread.currentThread().interrupt();
break;
//当还在进程中时
case MainActivity.GUI_THREADING_NOTIFIER:
//如果线程没有被中断
if(!Thread.currentThread().isInterrupted())
{
//设置进度条的进度标识
pb.setProgress(intCount);
//设置TextView的文本信息为“加载中...请稍后(%百分比%)”
tv.setText(getResources().getText(R.string.start)+ "(" + Integer.toString(intCount) + "%}");
}
break;
}
}
};
//单击事件
private OnClickListener listener = new OnClickListener()
{
@Override
public void onClick(View v)
{
//将ProgressBar设置为可见
pb.setVisibility(View.VISIBLE);
//设置ProgressBar初始为0
pb.setProgress(0);
//设置ProgressBar最多为100
pb.setMax(100);
//开启一个新的线程
new Thread(new Runnable()
{
// run()方法里面的代码会被自动调用
public void run()
{
for(int i = 0;i < 10; i++)
{
try
{
//计数器用以识别加载的进度
intCount = (i + 1) * 10;
//每运行一次循环休眠1秒
Thread.sleep(1000);
//当进程运行9秒后显示运行结束
if(i == 9)
{
//将Message作为参数传递给Handler
Message message = new Message();
//自定义消息的代码以便进行相应的处理
message.what = MainActivity.GUI_STOP_NOTIFIER;
//发送Message对象,把Message对象压入到消息队列的末尾,在handleMessage它将被接收 MessageHandler.sendMessage(message);
}
else
{
//将Message作为参数传递给Handler
Message message = new Message();
//自定义消息的代码以便进行相应的处理
message.what = MainActivity.GUI_THREADING_NOTIFIER;
//发送Message对象,把Message对象压入到消息队列的末尾,在handleMessage它将被接收MessageHandler.sendMessage(message);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
}).start();
}
};
}
三:常量文件
3.1 strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, MainActivity!</string>
<string name="app_name">ProgressBarAndHandlerDemo</string>
<string name="start">加载中...请稍后</string>
<string name="end">运行进程完毕</string>
</resources>
执行流程
运行效果如下