Android面试笔记之Handler详解


前言

Android面试基本知识点->Handler面试详解问题记录,后续会完善。


提示:以下是本篇文章正文内容,下面案例可供参考

一、什么是Handler

Handler是用来结合线程的消息队列来发送、处理"Message对象"和"Runnable对象"的工具。

  • 1、可以让对应的Message和Runnable在未来的某个时间点进行相应处理。
  • 2、让自己想要处理的耗时操作放在子线程,让更新ui的操作放在主线程。

二、Handler使用方法

  • 1、post(runnable)
///新建uiHandler 
private Handler uiHandler = new Handler();
///创建Thread
class DownloadThread  extends Thread{
        @Override
        public void run() {
            try{
                System.out.println("DownloadThread id " + Thread.currentThread().getId());
                System.out.println("开始下载文件");
                Thread.sleep(5000);
                System.out.println("文件下载完成");
                ///创建Runnable,用来刷新ui
                Runnable runnable = new Runnable() {
                    @Override
                    public void run() {
                        System.out.println("Runnable thread id " + Thread.currentThread().getId());
                        MainActivity.this.statusTextView.setText("文件下载完成");
                    }
                };
                ///将runnable添加到handler中
                uiHandler.post(runnable);
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        }
    }
///调用
private void start(){
        DownloadThread downloadThread = new DownloadThread();
        downloadThread.start();
    }
  • 2、sendMessage(message)
//uiHandler在主线程中创建,所以自动绑定主线程
 private Handler uiHandler = new Handler(){
  @Override
  public void handleMessage(Message msg) {
   switch (msg.what){
    case 1:
     System.out.println("handleMessage thread id " + Thread.currentThread().getId());
     System.out.println("msg.arg1:" + msg.arg1);
     System.out.println("msg.arg2:" + msg.arg2);
     MainActivity.this.statusTextView.setText("文件下载完成");
     break;
   }
  }
 };


class DownloadThread extends Thread{
  @Override
  public void run() {
   try{
    System.out.println("DownloadThread id " + Thread.currentThread().getId());
    System.out.println("开始下载文件");
    //此处让线程DownloadThread休眠5秒中,模拟文件的耗时过程
    Thread.sleep(5000);
    System.out.println("文件下载完成");
    //文件下载完成后更新UI
    Message msg = new Message();
    //虽然Message的构造函数式public的,我们也可以通过以下两种方式通过循环对象获取Message
    //msg = Message.obtain(uiHandler);
    //msg = uiHandler.obtainMessage();
 
    //what是我们自定义的一个Message的识别码,以便于在Handler的handleMessage方法中根据what识别
    //出不同的Message,以便我们做出不同的处理操作
    msg.what = 1;
 
    //我们可以通过arg1和arg2给Message传入简单的数据
    msg.arg1 = 123;
    msg.arg2 = 321;
    //我们也可以通过给obj赋值Object类型传递向Message传入任意数据
    //msg.obj = null;
    //我们还可以通过setData方法和getData方法向Message中写入和读取Bundle类型的数据
    //msg.setData(null);
    //Bundle data = msg.getData();
 
    //将该Message发送给对应的Handler
    uiHandler.sendMessage(msg);
   }catch (InterruptedException e){
    e.printStackTrace();
   }
  }
 }
}

///调用
private void start(){
        DownloadThread downloadThread = new DownloadThread();
        downloadThread.start();
    }

三、Handler机制远原理

四、Handler引起的内存泄漏及解决方法

原因:静态内部类持有外部类的匿名引用,导致外部Activity无法释放

  • 解决办法
  • 1、handler内部持有外部Activity的弱饮用,并把handler改为静态内部类。
  • 2、在Acrivity的onDestroy()中调用handler.removeCallback()方法;

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值