小问题汇总1-5

1.动态代理可以用来干什么?

可以干预接口的执行方式,能够在调用时刻对方法的参数修改(运行前),或者修改方法的执行过程(运行时)。

举个例子,在一次网络请求中,有一个方法中有一个回调接口,网络访问的结果都会在这个接口中传递出去,网络访问是耗时任务得开新线程,所以接口也在新线程中运行。可以通过代理,使接口在执行的时候发生在主线程,然后访问方法的参数。这样通过代理省略了线程切换功能。

2.handle泄漏的场景是什么?如何避免。

在java中非静态内部类匿名内部类都持有外部类的应用。

在Activity中使用非静态内部类或者匿名内部类对象Handler,当消息队列中有大量消息需要处理时,而Activity此时关闭了,jvm需要回收Activity对象, 如果handler在主线程,那么handler会持有Activity的引用, 导致Activity泄漏。如果handler不是在主线程就不会有问题。

主线程中的handler正确的使用方法是 使用静态内部类,然后持有Activity的弱引用。当Activity存在时,handler才处理消息。

不要在handler的消息处理中开启线程,这样大概率内存泄漏。

3.handler中的三个对象创建时间和作用?延迟消息如何发送?

handler是一个派发和处理消息的类。MessageQueue是一个消息队列,提供消息的入队和出队的方式。Message在其中的是以链表的方式存在。Looper主要作用是创建消息队列和开启循。一个线程中只能有一个looper(),这是因为looper.prepare()方法会从线程私有变量中获得looper对象,如果已经存在就报错,如果不存在就创建looper和 MessageQueue, 并且吧looper放到线程私有变量中去。

一个线程对应一个looper、messagequeue, 而线程中的handler可以有很多个。同一个线程中的handler共享一个Looper和Messagequeue.

消息入队列messagequeue.enqueueMessage()会根据延迟时间的大小插入到队列中(延迟时间比前一个大,比后一个小),消息的获取在messagequeue.next()方法中,只有队列头的消息到达延迟时间比当前或去的时间小才会messga出队列。

4.常见的内存优化工具

小问题汇总1-5_第1张图片

你可能感兴趣的:(每日一问)