一 几种Fragment懒加载方式
1 Add + hide+ show 方式 加载 fragment 时 可以搭配 onHiddenChanged
(boolean hidden)
2 ViewPager+Fragment 模式下的老方案
使用传统方式处理 ViewPager 中 Fragment 的懒加载,我们需要控制 setUserVisibleHint(boolean isVisibleToUser)
函数
3 Androidx 下的懒加载:Androidx 在 FragmentTransaction
中增加了 setMaxLifecycle
方法来控制 Fragment 所能调用的最大的生命周期函数
case 1ViewPager + Fragment =
Androidx下 设置了 ViewPager 的适配器为 FragmentPagerAdapter的构造里的值behavior 且 behavior 值为 BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT【behavior_resume_only_current_fragment】
case 2 add+ hide+show 设置 当前的fragment 设置setMaxLifecycle
resume hide的fragment 设置 setMaxLifecycle
onStart
4 ViewPager2 本身就支持对实际可见的 Fragment 才调用 onResume 方法
二 文字顶部贴边
三HandlerThread 能更新ui吗
四 Java中的同步锁 悲观锁 乐观锁
五 okhttp里的源码 怎么处理https的证书的
六性能优化
1 启动速度优化 非必须的sdk初始化代码 尽量延迟初始化 或者 在子线程中初始化
性能 优化: ui 卡顿 布局优化 ; 内存 优化; 耗电优化
ui卡顿布局优化: 减少嵌套【约束性布局,include,merge,viewstub】
内存优化 : 泄漏 抖动
七版本适配相关
八Android 内存优化:内存优化
1 内存泄漏: 检测工具:leakcanary
1-1集合类:集合类 添加元素后,仍引用着 集合元素对象,导致该集合元素对象不可被回收,从而 导致内存泄漏
解决方法:集合不用的时候 objectList.clear(); objectList=null;
1-2 尽量少用 Static 关键字 修饰变量
1-3 Handler 使用时的泄漏 使用1 静态内部类 自定义handler 2 mHandler.removeCallbacksAndMessages(null);
1-4 io流 或者 数据库游标Cursor、图片资源Bitmap 的关闭
2 内存抖动:
优化方案:尽量避免频繁创建大量、临时的小对象
九 泛型中 ? 和 T的区别?
总结: T 实例化的时候 需要指定具体的类型 。一旦确定了 就只能操作指定类的数据
?并不需要实例化,,是什么都可以 它只是个占位符;
public static <T> void show1(List<T> list){
for (Object object : list) {
System.out.println(object.toString());
}
}
public static void show2(List<?> list) {
for (Object object : list) {
System.out.println(object);
}
}
可以看到show1方法中我们使用了T,大家都知道这是泛型的常见写法,那么这里的T指的是某一类具体的对象,list集合里只能存放同一类型数据,如果插入不同类型数据则会报错。
那么show2方法中我们使用的是?,可以看到在void前面并没有<T>,?可以表示成占位符,它自己也不知道list集合中会存放多少种类型的数据,所以这样就表明我们的list中存放N种数据类型也是可以的。
我们通过一段测试代码来直观的感受一下二者的区别吧:
public static void test(){
List<Student> list1 = new ArrayList<>();
list1.add(new Student("zhangsan",18,0));
list1.add(new Student("lisi",28,0));
list1.add(new Student("wangwu",24,1));
//这里如果add(new Teacher(...));就会报错,因为我们已经给List指定了数据类型为Student
show1(list1);
System.out.println("************分割线**************");
//这里我们并没有给List指定具体的数据类型,可以存放多种类型数据
List list2 = new ArrayList<>();
list2.add(new Student("zhaoliu",22,1));
list2.add(new Teacher("sunba",30,0));
show2(list2);
}
十 如果 Handler 里发送 个延时消息,MessageQueue里有什么变化;
MessageQueue 队列里的消息 会按照时间顺序 排列,,把 延时最长的放在最末尾
MessageQueue.next()取消息的话,会判断当前时间 是否大于 msg.when( 存消息的时候会记录,他是存的时间戳+ 延时delay),才会取出
十一 ThreadLocal 怎么保证 线程里变量的唯一性
概念: ThreadLocal是线程的局部变量,常用来为每个线程提供独立的变量副本(可理解拷贝),没个线程可以随意改变其副本,而不会影响原版。
ThreadLocal 实例通常是类中的私有静态字段
原理:ThreadLocal 内部通过 线程map实现 变量副本 与 线程 对应的存储,,每个线程 存取只能操作副本
十二:String中==和equals的区别
https://blog.csdn.net/weixin_42754971/article/details/113906377
"=="操作符的作用:
- 用于基本数据类型的比较
- 判断引用是否指向堆内存的同一块地址。
- equals的作用:
- 用于判断两个变量是否是对同一个对象的引用,即堆中的内容是否相同,返回值为布尔类型
十三:if else与switch区别
十四 Activity 启动模式
十五 Activity 的启动流程
十六java类的加载机制之类的生命周期详解
类加载机制的话是双亲 委托机制: 答案:
十七:fragment 的 detach 和 attach 与 add hide 事务相关的
https://blog.csdn.net/u011941673/article/details/81872272?utm_source=blogkpcl14
十八 Gradle 构建流程;
https://blog.csdn.net/rikkatheworld/article/details/88747752
十九 startService和bindService的区别
二十 LinkedhashMap 有序的原理
二十一 okhttp 连接池复用机制
二十二:RecyclerView的 复用机制
二十三 ViewPager 和 viewPager2的区别
二十四 序列化的作用 以及 两种 方式 对比
二十五 mvc mvp mvvm 区别 和 使用场景
MVP优点:
model 与 view 解耦
Presenter 重要优点: presenter 可以复用
MVVM 优点:
2低耦合,视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的”View”上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
3可重用性,可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。【ViewModel 可重用】
4独立开发,开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xml代码。
二十六 ViewGroup什么情况下 会走到 onInterceptTouchEvent()
二十七 哪些文件 不能混淆
二十八 怎么计算一个bitmap加载到内存中的大小
二十九 Application 的onCreate()方法会执行几次?
三十 JSBridge java 与 js交换
三十一 jetPack
三十二 HashMap 和 hashTable的区别
1 Hashtable是线程安全,而HashMap则非线程安全。Hashtable的实现方法里面都添加了synchronized关键字来确保线程同步,因此相对而言HashMap性能会高一些
2 HashMap可以使用null作为key,不过建议还是尽量避免这样使用。HashMap以null作为key时,总是存储在table数组的第一个节点上。而Hashtable则不允许null作为key。
3 HashMap 内部的数据结构是 数组+ 链表 HashTable内部数据结构是数组+ 链表+ 红黑二叉树
4 HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75
5 HashMap扩容时是当前容量翻倍即:capacity*2,Hashtable扩容时是容量翻倍+1即:capacity*2+1
三十三 Synchronized和Volatile的比较
1)Synchronized保证内存可见性 和 操作的原子性
2)Volatile只能保证内存可见性
3)Volatile不需要加锁,比Synchronized更轻量级,并不会阻塞线程(volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。)
4)volatile标记的变量不会被编译器优化,而synchronized标记的变量可以被编译器优化(如编译器重排序的优化).
5)volatile是变量修饰符,仅能用于变量,而synchronized是一个方法或块的修饰符。
volatile本质是在告诉JVM当前变量在寄存器中的值是不确定的,使用前,需要先从主存中读取,因此可以实现可见性。而对n=n+1,n++等操作时,volatile关键字将失效,不能起到像synchronized一样的线程同步(原子性)的效果。
三十四 在哪里 检测 app冷启动的时长 和 app渲染时长
三十五Android 中刷新 invalidate 和 postInvalidate 的区别
三十五 context的理解 Application。context 和 Activity.context的区别
三十六 java修饰符 public private protect 区别
三十七 Res和 asset 的区别
三十八 SP 存数据 commit 和 apply的区别,有没有看过源码,怎么会造成anr
三十九 bitmap加载 大图片 怎么分块加载
四十 JAVA中String="abc"和String=new String("abc")的区别与联系
四十一 双重检查锁的 volatile 和 双重检查的作用?
四十二 LayoutInflater中inflate方法两个参数和三个参数的区别
四十三 TCP和 UDP的区别
四十四 java基本数据类型占用字节数
四十五 Android String 与 java的String有什么区别?
四十六 view中invalidate()和requestLayout()的生命周期
四十七 ArrayList和 LinkedList区别?
1 ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2 arrayList 查询快 增删慢 linkedList 增删快 查询慢
3 同步性 【都是非线程安全的】
ArrayList,LinkedList是不同步的,而Vestor是同步的。所以如果不要求线程安全的话,可以使用ArrayList或LinkedList,可以节省为同步而耗费的开销。但在多线程的情况下,有时候就不得不使用Vector了。当然,也可以通过一些办法包装ArrayList,LinkedList,使他们也达到同步,但效率可能会有所降低。
四十八 View中的left和getx和translationx之间的区别