Handler认识初步(一)

package chine.joy.test;
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;
/**
 * Handler主要接受 子线程发过来的数据,并用此数据配合主线程更新UI
 * 当应用程序启动时,安卓会首先开启一个主线程,主线程主要是进行 UI更新和事件分发,比如按下按钮,Android就把点击事件
 * 分发到Button上,又比如你下载一个大文件或者是打开一个大的本地文件,要是在主线程中进行,超过5秒要是还没下载下来或者
 * 打开文件,安卓系统就会提示你“强制关闭”,所以要把耗时的操作放在子线程中处理,但是子线程数据更新会对UI更新,在主线程
 * 以外的线程中更新UI是不安全的,所以要 Handler在主线程中接受要更新的数据,在子线程中发送数据。
 * 由于Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据,这个时候,
 * Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象,(里面包含数据)  , 
 * 把这些消息放入主线程队列中,配合主线程进行更新UI。Handler主要进行 异步消息的处理,所谓异步消息就是sendMessage(msg)
 * 把消息对象加到消息队列中后,发送消息的方法就返回了,代码继续向下进行。在另外一个部分中(handleMessage(Message msg))
 * 对消息队列中的消息逐个的进行处理。发送消息和接受消息不是同步的进行。
 * @author joychine
 *下面是每隔1妙就更新进度条的进度(i=i+10)
 */
public class HandlerTest1Activity extends Activity {
	private Button startButton;
	private ProgressBar bar;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        startButton = (Button) findViewById(R.id.startButton);
        bar = (ProgressBar) findViewById(R.id.bar);
        startButton.setOnClickListener(new ButtonListener());
      //这句话会和Runnable的run()方法中的输出一样,证明Handler.post(r)其实是执行了Runnable中的
        //run()方法没有执行start()方法。
        System.out.println(Thread.currentThread().getId());
        
    }
    class ButtonListener implements OnClickListener {

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			bar.setVisibility(View.VISIBLE);
			myhHandler.post(updateRunnable);//这里其实是直接执行了Runnable的对象并没有新起一个线程
			//并没有调用线程 的start()方法,而是直接调用了线程的run()方法。
		}
    }
 // 当创建一个新的Handler实例时, 它会绑定到当前线程和消息的队列中,开始分发数据
             // Handler有两个作用, (1) : 定时执行Message和Runnalbe 对象
            // (2): 让一个动作,在不同的线程中执行.
    
           // 它安排消息,用以下方法
           // post(Runnable)
           // postAtTime(Runnable,long)
           // postDelayed(Runnable,long)
            // sendEmptyMessage(int)
            // sendMessage(Message);
            // sendMessageAtTime(Message,long)
            // sendMessageDelayed(Message,long)
          
            // 以上方法以 post开头的允许你处理Runnable对象
            //sendMessage()允许你处理Message对象(Message里可以包含数据,)

    Handler myhHandler = new Handler() {
    	 // 子类必须重写此方法,接受数据
		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			bar.setProgress(msg.arg1);
			myhHandler.post(updateRunnable);
		}
    	
    };
     Runnable updateRunnable  = new Runnable() {
		int i=0 ;
		@Override
		public void run() {
			// TODO Auto-generated method stub
			System.out.println(Thread.currentThread().getId());
			i=i+10;
			/*Bundle bundle = new Bundle();
			bundle.putString("aa", "卡看");
			msg.setData(bundle)*/
			//用Handler对象获得一个 Message对象
			Message msg = myhHandler.obtainMessage();
			msg.arg1 = i;
			try {
				Thread.sleep(1000);
			} catch (Exception e) {
				// TODO: handle exception
			}
			//向主线程发送数据更新UI
			myhHandler.sendMessage(msg);
			if (i==100) {
				myhHandler.removeCallbacks(updateRunnable);
			}
		}
	};
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值