举例说明ProgressBar与Handler的应用

该博客介绍如何在Android应用中使用ProgressBar与Handler进行交互,以在后台任务执行时提供进度提示。通过示例代码展示了如何在点击按钮后显示ProgressBar,设置最大值和初始值,并在后台线程中更新进度。同时,使用Handler发送消息到主线程更新UI,当任务完成时隐藏ProgressBar。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android的Widget,有许多是用于User交互设计的,但也有一些是用于程序提示的,比如其中的ProgressBar,其与ProgressDialog对话框的应用目的相似,但后者是继承自Android.app.ProgressDialog所设计的交互对话窗口。在应用ProgressDialog的时候要新建它的对象,在运行时会弹出“对话框”作为提醒,此时应用程序后台会失焦,直到进程结束,才会将主控权交给应用程序,如果在Activity当中不希望后台失焦,又希望User有某后台程序正处于忙碌阶段,此时,就要用到ProgressBar了。

ProgressBar可以在res/layout/main.xml中布局,但是ProgressDialog不能。

 

(此程序是在Android SDK2.3.3环境下开发的)例子如下:

public class A05Activity extends Activity {
 private TextView tv;

/*按钮的作用是让部署在main.xml里的ProgressBar显示出来(原来是设置为*Android:visibility="gone"),因为默认在main.xml中没有指定它的indeterminate属性,所*以即使在程序中强制使用了ProgressBar的setIndeterminate()方法,也无法的、改变*ProgressBar.getProgress()的值,这个值将永远为0。因此使用循环图片动画作为运行

*过程中的动画,并用了一个intCounter来递增,表示运行的百分比。*/
 private Button b;

//声明两个整数作为信息传递出来时的讯号标识,前者为Thread需要喊停时的处理,后

//者为进程正在运行过程中所需处理的标识。
 protected static final int GUI_STOP_NOTIFIER=0x108;
 protected static final int GUI_THREADING_NOTIFIER=0x109;
 private ProgressBar pb;
 private int intCounter=0;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        tv=(TextView)findViewById(R.id.tv);
        b=(Button)findViewById(R.id.button);
        b.setBackgroundColor(Color.YELLOW);
        pb=(ProgressBar)findViewById(R.id.pb);
        pb.setIndeterminate(false);//开始把ProgressBar设为隐藏
        pb.setBackgroundColor(Color.GREEN);
        b.setOnClickListener(new OnClickListener(){

   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    tv.setText(R.string.str_progress_start);
    pb.setVisibility(View.VISIBLE);//当单击按钮后将ProgressBar设为可见
    pb.setMax(100);//设置ProgressBar的最大值
    pb.setProgress(0);//设置ProgressBar的初始值
    new Thread(new Runnable(){

     @Override
     public void run() {
      // TODO Auto-generated method stub
      for(int i=0;i<10;i++){
       try {
        intCounter=(i+1)*20;
        Thread.sleep(1000);
        if(i==4){
         Message m=new Message();
         m.what=A05Activity.GUI_STOP_NOTIFIER;
         A05Activity.this.myMessageHandler.sendMessage(m);        
         break;
        }
        else{
         Message m=new Message();
         m.what=A05Activity.GUI_THREADING_NOTIFIER;
         A05Activity.this.myMessageHandler.sendMessage(m);
        }
       } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
       }
      }
     }
     
    }).start();
   }
         
        });
    }

//新起的进程无法访问Activity里的Widget,也无法将运行状态外送出来,因此使

//用Handler和Message对象,将进程里的状态往外传递,最后由Activity的Activity

//的Handler事件接收取得运行的状态。
    Handler myMessageHandler=new Handler(){
     public void handleMessage(Message m){
      switch(m.what){
      case A05Activity.GUI_STOP_NOTIFIER:
       tv.setText(R.string.str_progress_done);
       pb.setVisibility(View.GONE);
       Thread.currentThread().interrupt();
       break;
      case A05Activity.GUI_THREADING_NOTIFIER:
       if(!Thread.currentThread().isInterrupted()){
        tv.setText(getResources().getText(R.string.str_progress_start)+"("+Integer.toString(intCounter)+"%)\n"+"Progress:"+Integer.toString(pb.getProgress())+"\n"+"Indeterminate"+Boolean.toString(pb.isIndeterminate()));
       }
       break;
      }
      super.handleMessage(m);
     }
    };
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值