Android之Handler简单运用(控制进度条)

来源:互联网 发布:斯巴达刀座淘宝 编辑:程序博客网 时间:2024/06/08 03:25

Handler消息传递机制在android中至关重要,Android应用开发中,我们需要用线程周期性的改变控件的属性值,而此则需要Handler的消息机制去实现。

Handler类的主要作用与用法:

在新启动的线程中发送消息;在主线程获取,处理消息。

利用一个实例来介绍Handler的使用方法----Handler控制进度条。

资源文件:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >    <!-- 一个进度条控件 -->    <ProgressBar         android:id="@+id/bar"        style="?android:attr/progressBarStyleHorizontal"        android:layout_width="200dp"        android:layout_height="wrap_content"        android:visibility="gone"        />    <!-- 一个Button按钮控件 -->    <Button         android:id="@+id/startBtn"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text="start"/>    </LinearLayout>

Activity代码:

package cn.android.handler;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ProgressBar;public class HandlerProgressBarActivity extends Activity implements OnClickListener{    //声明两个控件ProgressBar bar = null;    Button startButton = null;        public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                findViews();    }    //通过控件ID得到控件private void findViews() {bar = (ProgressBar) this.findViewById(R.id.bar);startButton = (Button) this.findViewById(R.id.startBtn);//为控件添加监听器;bar.setOnClickListener(this);startButton.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch(v.getId()){case R.id.startBtn://设置进度条显示方式为可见bar.setVisibility(View.VISIBLE);//将线程添加到Handler消息队列updateBarHandler.post(updateThread);break;}}//使用匿名内部类Handler updateBarHandler = new Handler(){public void handleMessage(Message msg){bar.setProgress(msg.arg1);Log.i("SWORD", "startHandler");updateBarHandler.post(updateThread);}};//使用匿名内部类声明线程类Runnable updateThread = new Runnable(){int i = 0;public void run(){Log.i("SWORD", "Begin Thread");i+=10;//得到一个消息对象Message msg = updateBarHandler.obtainMessage();//将msg对象的arg1参数的值设置为i;msg.arg1 = i;try {//设置当前线程休眠1秒Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}//将msg对象加入到消息队列当中(尾部)updateBarHandler.sendMessage(msg);if(i==100){//如果当i的值为100时将当前线程从handler中移除updateBarHandler.removeCallbacks(updateThread);}}};}

在虚拟机上的运行效果:



原创粉丝点击