2020-07-07 准备腾讯客户端开发面试
-
什么是BLE,以及BLE的应用场景是什么?
答:BLE是Bluetooth Low Energy,低功耗蓝牙。BLE主要应用在短距离设备通信,距离限制在0-50m左右。 -
利用i++聊聊线程安全问题,如何解决线程安全?
答:线程间共享内存,导致多线程下i的数值被多个线程控制,造成线程不安全,可以使用synchronized关键字避免。 -
Android系统里的消息传递机制 Handler
- handler是android线程之间的消息机制,主要的作用是将一个任务切换到指定的线程中去执行,android系统中的一个例子就是主线程中的所有操作都是通过主线程中的handler去处理的。
- Handler的运行需要底层的 messagequeue和 looper做支撑。
-
Handler机制可以简述为:Handler将Message发送到Looper的消息队列中,即MessageQueue,等待Looper的循环读取Message,处理Message,然后调用Message的target,即附属的Handler的dispatchMessage()方法,将该消息回调到handleMessage()方法中,然后完成更新UI操作。
image.png
- 简述Android中的ANR,以及为什么会出现ANR?
ANR就是Application Not Responding ,即应用程序未响应,之所以会造成这种异常是因为Android是在主线程即UI线程中更新界面的,但是如果在UI线程中进行过多的耗时操作就会堵塞主线程从而造成ANR,具体造成ANR的原因有三个:
以下四个条件都可以造成ANR发生:
- InputDispatching Timeout:5秒内无法响应屏幕触摸事件或键盘输入事件
- BroadcastQueue Timeout :在执行前台广播(BroadcastReceiver)的onReceive()函数时10秒没有处理完成,后台为60秒。
- Service Timeout :前台服务20秒内,后台服务在200秒内没有执行完毕。
- ContentProvider Timeout :ContentProvider的publish在10s内没进行完。
- Java 单例模式
- 意图: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。
- 主要解决:一个全局使用的类频繁地创建与销毁。
- 缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
- 何时使用:当您想控制实例数目,节省系统资源的时候。
- 如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
- 关键代码:构造函数是私有的。
- 懒汉式:线程安全;效率低
public class Singleton{
private static Singleton instance;
private Singleton();
private static synchronized Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
- 饿汉式:无锁,效率高,线程安全;类加载时初始化,浪费内存,容易产生垃圾对象。
public class Singleton{
private static Singleton instance = new Singleton();
private Singleton(){};
private static Singleton getInstance(){
return instance;
}
}
- java 内存泄漏:不再会被使用的对象的内存不能被回收。
- 静态集合类,如HashMap、LinkedList等等。如果这些容器为静态的,那么它们的生命周期与程序一致,则容器中的对象在程序结束之前将不能被释放,从而造成内存泄漏。
- 各种有close()方法的连接,如数据库连接、网络连接和IO连接等。
- 一个变量的定义的作用范围大于其使用范围
- 缓存泄漏
- 监听器和其他回调
- java 异常处理:Java所有异常类都是 Throwable的子类。它包括Java异常处理的两个重要子类:Error和Exception.
- Error是指程序无法处理的错误,多指系统内部比较严重的错误。大多数这类错误与开发人员无关
- Exception:运行时异常和非运行时异常。运行时异常多指程序逻辑上出现问题(也就是我们自己写代码逻辑出了问题),常见的错误包括ClassCastException:类型转换异常 、NullPointerException:空指针异常 、IndexOutOfBoundsException:越界异常 ..
- 在 Java 应用程序中,异常处理机制为:抛出异常,捕捉异常。
① 抛出异常:当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。
② 捕捉异常:在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler)。潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,即为合适的异常处理器。运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行。当运行时系统遍历调用栈而未找到合适的异常处理器,则运行时系统终止。同时,意味着Java程序的终止。
- 抛出异常的方法:
① throws:通常被用在声明方法时,用来指定方法可能抛出的异常,多个异常可使用逗号分隔。throws关键字将异常抛给上一级,如果不想处理该异常,可以继续向上抛出,但最终要有能够处理该异常的代码。
② throw:通常用在方法体中或者用来抛出用户自定义异常,并且抛出一个异常对象。程序在执行到throw语句时立即停止,如果要捕捉throw抛出的异常,则必须使用try-catch语句块或者try-catch-finally语句。