android中的Handler(一)

android中的Handler(1)

android中的Handler(1)

一、Hanler?

Handler可以认为是一个容器,可以装Runnable和Message用于信息的传递,
 当其装载的Runnable发出Message时,会触发Handler对Message进行处理
 Handler 主要有两个用处:
 1.在将来的某个时刻调度存放在其中的messages and runnables
 2.独立于持有Handler的线程

二、场景

下载文件,提供一个下载进度条,当下载完成时,提示下载完成


android中的Handler(一)

三、代码

package linys.handler;

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.Toast;
/**
 * 
 * @Project: Android_ProgressBarHandler
 * @Desciption: Handler的Demo:
 * Handler可以认为是一个容器,可以装Runnable和Message用于信息的传递,
 * 当其装载的Runnable发出Message时,Handler会对Message进行处理
 * 
 * Handler 主要有连个用处:
 * 1.在将来的某个时刻调度存放在其中的messages and runnables
 * 2.独立于持有Handler的线程 
 * @Author: LinYiSong
 * @Date: 2011-3-9~2011-3-9
 */
public class HandlerProgressBar extends Activity {
	
	private ProgressBar bar;
	private Button btn;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //取得控件
        bar=(ProgressBar)this.findViewById(R.id.bar);
        btn=(Button)this.findViewById(R.id.myButton);
        /*
         * 为控件添加监听器
         *当点击后,启动r线程(此处还是不独立主线程,可以看做是普通的方法调用)
         */
        btn.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View v) {
				bar.setVisibility(View.VISIBLE);
				//启动Handle中的线程
				handler.post(r);//使用handler的post方法其实还是在调用它的线程中,并没有独立于主线程
			}});
    }
    Handler handler=new Handler(){
		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			//设置进度条的进度值
			int i=msg.arg1;
			bar.setProgress(i);
			handler.post(r);
		}
    	
    };
    Runnable r=new Runnable(){
    	int i=0;
		@Override
		public void run() {
			i=i+10;
			//向handler中的信息变量保存值
			Message msg=handler.obtainMessage();
			msg.arg1=i;
			//sleep 1s 后想handler发出信息,如果下载完成,则提下载完成,并移除线程
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
			//到100时结束
			if(i==100){
				Toast.makeText(HandlerProgressBar.this,"下载完成",Toast.LENGTH_SHORT).show();
				handler.removeCallbacks(r);
			}else{
				handler.sendMessage(msg);
			}
		}
    };
   
}