对Handler机制的”粗“理解

在Android系统中,当子线程下载一个文件时,怎么告诉主线程让他更新主页面,以提醒用户那?

子线程无法直接对主页面进行更新,这时需要一个传话的(Handler),子线程需要借助Handler来告诉主线程更新页面

那我们简单了解下关于Handler传递消息时要用的对象

 

1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。 
2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息。
3) Message Queue(消息队列):用来存放线程放入的消息。 

4)线程:UIthread 通常就是main thread,而Android启动程序时会替它建立一个MessageQueue。

 

子线程发送一个消息到Message Queue(消息队列),Looper一直管理着这个队列,新来的排下面,最上层的发送给主线程,主线程通过HandlerMessage接受message更新更新线程

下面这个是通过Handler更新主线程Progressbar的例子,我们可以更好的学习了解handler 

  public class MainActivity extends Activity {

    private ProgressBar progressBar;

    //新建一个 Handler 对象

    private Handler handler = new Handler(){

   //重写里边的 handleMessage()方法

   @Override

   public void handleMessage(android.os.Message msg) {

   //更新进度

   progressBar.setProgress(msg.what);

   };

   };

@Override

  protected void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.activity_main);

  //找到 ProgressBar 控件

  progressBar = (ProgressBar) findViewById(R.id.progressBar);

  //设置最大参数值

  progressBar.setMax(10);

  //新建一个子线程模拟一个耗时操作

  new Thread(new Runnable() {

  @Override

  public void run() {

  // TODO Auto-generated method stub

  for (int i = 0; i <= 10; i++) {

  try {

  //睡眠一秒

  Thread.sleep(1000);

  } catch (InterruptedException e) {

  // TODO Auto-generated catch block

  e.printStackTrace();

 }

  //新建消息对象

  Message m = new Message();

  //将 i 的值作为进度参数传递过去

  m.what = i;

  

  //通过 handler 对象发送消息

  handler.sendMessage(m);

  }

 }

  }).start();

 }

 }

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值