前言
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提供了大量能使我们快速便捷地处理数据的函数和方法。