Android入门开发之 Handler使用

╰半橙微兮° 2022-03-19 08:38 374阅读 0赞

Android提供了一个异步的消息回调机制Handler, 它负责发送消息和处理线程消息队列中的消息及runnable对象

Handler实例都是与一个线程和该线程的消息队列一起使用,一旦创建了一个新的handler实例,系统就把该实例与一个线程和该线程的消息队列捆绑起来,这将可以发送消息和runnable对象给该消息队列,并在消息队列出口处处理它们。

Handler默认使用当前的线程RunLoop, 但是也可以通过它的构造函数来指定某个线程的runloop, 或者使用专用的HandlerThread。

必须要注意的是, 使用Handler的线程中,必须实现了Runloop消息循环,否则会产生运行异常。

通常情况下,如果我们在主线程使用Handler, 则不需要我们主动去创建runloop, 因为android系统为自动为activity主线程创建一个runloop。

同样我们可以在一个特殊的子线程中使用Handler,而不必去创建runloop。这个特殊子线程就是HandlerThread, 查看其源码,我们可以发现,它也在run方法中实现了runloop。

1364634771_7335.png

下面就介绍Handler的几种使用场景和用法:

1. 在主线程中使用Handler

主线程中使用Handler相对简单, 下面的示例代码实现了在主线程中创建Handler对象,启动一个runable方法去刷新进度条。代码如下:

  1. //在主线程中创建一个Handler对象
  2. Handler handler = new Handler()
  3. {
  4. public void handleMessage(Message msg)
  5. {
  6. firBar.setProgress(msg.arg1);
  7. handler.post(updateThread);
  8. Log.v("thread----", Thread.currentThread().getName());
  9. }
  10. };
  11. handler.post(updateThread); //去运行
  12. //创建一个runable去刷新进度条
  13. Runnable updateThread = new Runnable() {
  14. @Override
  15. public void run() {
  16. // TODO Auto-generated method stub
  17. if ( i>= 100) {
  18. handler.removeCallbacks(updateThread);
  19. return;
  20. }
  21. i += 10;
  22. Message msg = handler.obtainMessage();
  23. msg.arg1 = i;
  24. try {
  25. Thread.sleep(1000); //线程暂停1s
  26. } catch (InterruptedException e) {
  27. // TODO: handle exception
  28. e.printStackTrace();
  29. }
  30. handler.sendMessage(msg);
  31. handler1.sendEmptyMessage(0);
  32. }
  33. };

2. 在普通的子线程中使用Handler

示例代码如下:

  1. //创建一个子线程,在其中使用Handler
  2. class MyThread extends Thread
  3. {
  4. public void run() {
  5. Looper.prepare();
  6. handler1 = new Handler()//Looper.getMainLooper()
  7. {
  8. public void handleMessage(Message msg)
  9. {
  10. Log.v("SubThread",Thread.currentThread().getName());
  11. // 这里执行耗时操作,不会影响到UI主线程
  12. for (int i = 0; i < 1000000000; i++) {
  13. }
  14. }
  15. };
  16. Looper.loop();
  17. }
  18. }

3. 在HandlerThread线程中使用Handler

  1. HandlerThread handlerThread = new HandlerThread("handlerThread");
  2. handlerThread.start();
  3. //这里获取到HandlerThread的runloop
  4. MyHandler myHandler = new MyHandler(handlerThread.getLooper());

发表评论

表情:
评论列表 (有 0 条评论,374人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Android入门开发SAX

    一. SAX简介 SAX, Simple API for XML, 是一个解析速度快并且占用内存少的XML解析器,适合于移动平台。 它同时既是一种接口,也是指一个软

    相关 androidhandler

    Android程序中一些操作是不能放在activity中的,因为非常耗时,如下载过程。这时,需要使用handler,即重新启动一个与activity并行的线程,下面是使用han