Android 斗鱼面经
Android 斗鱼面经
文章目录
- Android 斗鱼面经
- 一面
- 二面
一面
- 先简单描述一下JVM JRE JDK的关系
:::info
JVM(Java Virtual Machine)
Java 虚拟机。它只认识 xxx.class 这种类型的文件,它能够将 class 文件中的字节码指令进行识别并调用操作系统向上的 API 完成动作。所以说,JVM 是 Java 能够跨平台的核心。
JRE (Java Runtime Environment)
Java 运行时环境。它主要包含两个部分,JVM的标准实现和 Java 的一些基本类库。它相对于 JVM来说,多出来的是一部分的 Java 类库。
JDK (Java Development Kit)
Java 开发工具包。JDK 是整个 Java 开发的核心,它集成了 JRE 和一些好用的小工具,例如javac.exe、java.exe、jar.exe 等。
显然这三者的关系是一层层的嵌套关系,即JDK > JRE > JVM。
:::
- 静态代理和动态代理有什么区别吗,静态代理和动态代理的应用场景
:::info
1、静态代理通常只代理一个类,动态代理是代理一个接口下的多个实现类。
2、静态代理事先知道要代理的是什么,而动态代理不知道要代理什么东西,只有在运行时才知道。
3、动态代理是实现JDK里的InvocationHandler接口的invoke方法,但注意的是代理的是接口,也就是你的业务类必须要实现接口,通过Proxy里的newProxyInstance得到代理对象。
应用场景:如果⽬标类的数量很多的话,代理类的实现也必然得很多,可能会造成代码量过于庞⼤,可能会增加代码的冗余度…再者,如果⽬标类需要代理的⽅法很多的话,代理类需要对这些⽅法⼀⼀实现代理逻辑,代理类的实现也将会很庞⼤。目标对象不固定,在应用程序执行时,动态创建目标对象。这时候使用动态代理,目标角色固定,应用程序执行前就得到目标角色,这时候使用静态代理
:::
- leakcanaryd有看过吗?
- 四大引用
- JVM垃圾回收新生代是怎么进行划分的
- Android里面原生设计的设计模式举例分析一下
:::info
建造者模式:Android#AlertDialog Bitmap#Bulider
观察者模式:View#OnClickListener
单例模式:Application
责任链:Okhttp拦截器模式
适配器:RecyclerView.Adapter
推荐阅读:
从Android源码角度谈设计模式(一):创建型模式 - 掘金
从Android源码角度谈设计模式(二):结构型模式 - 掘金
从Android源码角度谈设计模式(三):行为型模式 - 掘金
:::
- 单例模式有哪几种实现方式
- Handler机制了解过吗?
- 斗鱼App主页的启动模式
- 怎么判断下载的软件已经被下载过,或者下载软件百分比
:::info
1.通过获取系统上已安装的所有app列表来查找【不推荐。因为要获取已安装的所有app信息,可能会有隐私泄露风险】
:::
public static boolean checkAppInstalled(Context context, String pkgName) {
if (TextUtils.isEmpty(pkgName)) {
return false;
}
PackageManager packageManager = context.getPackageManager();
// 获取已安装的app信息
List<PackageInfo> pkgInfos = packageManager.getInstalledPackages(0);
if (pkgInfos != null) {
for (int i = 0; i < pkgInfos.size(); i++) {
String pkg = pkgInfos.get(i).packageName;
if (pkgName.equals(pkg)) {
return true;
}
}
}
return false;
}
:::info
2.通过获取特定包名的app信息来判断【推荐。因为只关注特定包名的app信息,隐私泄露风险低】
:::
public static boolean checkQQInstalled(Context context, String pkgName) {
if (TextUtils.isEmpty(pkgName)) {
return false;
}
try {
context.getPackageManager().getPackageInfo(pkgName, 0);
} catch (Exception x) {
return false;
}
return true;
}
二面
这一面主要是项目和实习经验,基本都是考验你项目里面学到了什么,积累了什么
- Gson是怎么做数据解析的,怎么进行高效数据解析?