对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();

 }

 }

猜你喜欢

转载自blog.csdn.net/l929272214/article/details/73839719
今日推荐