Handle,AsyncTask面试详解

本文详细介绍了Android开发中Handle和AsyncTask的工作原理及其使用方法,包括如何避免内存泄漏等问题。

一、什么是handle
handle通过发送和处理Messgae 和Runnable对象来关联对应线程的MessageQueue。
1,可以让对应的Messgae和Runnable在未来的某个时间的进行相应的处理;
2,让自己想要的耗时操作放在子线程,更新ui放在主线程;
二、handle用法
1, post(runnable)
2,sendMessage(message)

三、handle机制
handle机制
四、handle存在内存泄漏的隐患

因为同一个线程下的handler共享一个looper对象,消息中保留了对handler的引用,由于Java在生成内部类的时候,原本没有构造器的内部类会被生成一个带外部类参数的构造器,这个内部类就会持有外部类的隐式引用。Handler其实隐式的持有了Activity的引用,只要有消息在队列中,那么handler便无法被回收,如果handler不是static那么使用Handler的Service和Activity就也无法被回收。这就可能导致内存泄露。当然这通常不会发生,除非你发送了一个延时很长的消息。

  在java里,非静态内部类和匿名类都会潜在的引用它们所属的外部类。但是,静态内部类却不会。因此将handler改成静态的就可以有效的避免对Activity的隐式引用,从而避免内存泄漏。

解决办法:1,handle内部持有activity的若引用,并把handle改为静态内部类 , handler.removeCallbacks();

AsyncTask面试详解

  1. AsyncTask的使用简介

    AsyncTask是对Handler与线程池的封装。使用它的方便之处在于能够更新用户界面,当然这里更新用户界面的操作还是在主线程中完成的,但是由于AsyncTask内部包含一个Handler,所以可以发送消息给主线程让它更新UI。另外,AsyncTask内还包含了一个线程池。使用线程池的主要原因是避免不必要的创建及销毁线程的开销。设想下面这样一个场景:有100个只需要0.001ms就能执行完毕的任务,如果创建100个线程来执行这些任务,执行完任务的线程就进行销毁。那么创建与销毁进程的开销就很可能成为了影响性能的瓶颈。通过使用线程池,我们可以实现维护固定数量的线程,不管有多少任务,我们都始终让线程池中的线程轮番上阵,这样就避免了不必要的开销。

2,使用方法

AsyncTask是一个抽象类,我们在使用时需要定义一个它的派生类并重写相关方法。AsyncTask类的声明如下:

public abstract class AsyncTask<Params, Progress, Result> 

Params:doInBackground方法的参数类型;
Progress:AsyncTask所执行的后台任务的进度类型;
Result:后台任务的返回结果类型。

我们再来看一下AsyncTask类主要为我们提供了哪些方法:

onPreExecute() //此方法会在后台任务执行前被调用,用于进行一些准备工作
doInBackground(Params... params) //此方法中定义要执行的后台任务,在这个方法中可以调用publishProgress来更新任务进度(publishProgress内部会调用onProgressUpdate方法)
onProgressUpdate(Progress... values) //由publishProgress内部调用,表示任务进度更新
onPostExecute(Result result) //后台任务执行完毕后,此方法会被调用,参数即为后台任务的返回结果
onCancelled() //此方法会在后台任务被取消时被调用

三,AsyncTask工作原理
1,AsyncTask本质上是一个静态的线程池,AsyncTask派生的子类可以实现不同的异步任务,这些任务都交到静态线程池中进行;
2,线程池中的工作线程调用doInBackground(Params… params)执行异步任务;
3,当任务状态改不之后,工作线程会向ui线程发送消息,AsyncTask内部的InternalHandler会响应这些消息,并调用相关的回调函数。

总结:内部封装了线程池,通过handle发送消息,在ui线程和子线程传递。

四,AsyncTask的注意事项
1,内存泄漏(同handle)
2,生命周期(不跟随activity的生命周期,不会销毁,必须调用cancel()方法)
3,结果丢失。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值