1.Activity
Activity启动流程**
Activity + Fragment 生命周期
Activty的销毁是什么概念,ondestroy调用之后对象是否还存在
2.BroadcastReceiver
广播的使用以及种类?
发出:有序(可拦截可修改),无序(不可拦截,不可修改),本地(app内部传播localbroadcastManager.sendBroadcast)
接受:动态(新建一个类,继承BroadcastReceiver),静态(在AndroidManifest中注册)
3.Service
两种生命周期区别作用,如何选择
Service如果频繁启动一个Service,生命周期是怎样
前台Service
HandlerThread、IntentService理解
Activity 和 Service 之间的通信,Service 和Activity之间如何传递数据,如何实时监听Service数据变化
Service的多进程模式 & 不死进程
Android N,O,P上面service是不同的,有什么不同
除了普通 service和IntentService,你还知道什么Service,不包括自定义的
AIDL,AIDL 解决了什么问题
如何保证一个后台服务不被杀死,比较省电的方式是什么
修改onStartCommand(…)方法的返回值为START_STICKY可实现停止服务之后重启服务。
提升service优先级:AndroidManifest.xml文件中对于intent-filter可以通过android:priority = "1000"这个属性设置最高优先级
提升service进程优先级:设置为前台服务,依附于和用户交互的前台进程。
onDestroy方法里重启service:
public void onDestroy(){
Intent localIntent = new Intent();
localIntent.setClass(this, MyService.class); // 销毁时重新启动Service
this.startService(localIntent);
}
就是在service的onCreate方法里边
startForeground(1, notice);
第一个参数是不为零的数,代表通知ID
第二个参数是通知的内容
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
Notification notice = new Notification();
startForeground(1, notice);
}
8.0 以后不希望后台应用运行后台服务,除非特殊条件
一旦通过startForegroundService() 启动前台服务,必须在service 中有startForeground() 配套,不然会出现ANR 或者crash
startForeground() 中的id 和notification 不能为0 和 null
4.ContentProvider
5.Handler原理
什么是ThreadLocal
ThreadLocal:ThreadLocal–>ThreadlocalMap(key , value),hreadLocal变量的活动范围为某线程
oncreate中,开启三个线程,1.普通handler,2.UImain runnable 3. view runnable
Looper怎么确定的把消息发给哪一个handler:msg.target = this;
Looper一直在循环MessageQueue,没有消息时为什么不会造成主线程ANR?
loop采用的是epoll+pipe(模型),有消息就依次执行,没消息就block住,让出CPU,等有消息了,epoll会往pipe中写一个字符,把主线程从block状态唤起,主线程就继续依次执行消息。
epoll模型
当没有消息的时候会epoll.wait,等待句柄写的时候再唤醒,这个时候其实是阻塞的。你知道有哪些阻塞队列吗?
MessageQueue是阻塞队列吗?
非阻塞式集合,这类集合也包括添加和移除的方法,如果方法不能立即被执行,则返回null或抛出异常,但是调用这个方法的线程不会被阻塞。:ConcurrentLinkedQueue , ConcurrentLinkedDeque
阻塞式集合,这类集合包括添加和移除的数据方法。当集合已满或为空时,被调用的添加或者移除方法就不能立即被执行,那么调用这个方法的线程将被阻塞,一直到该方法可以被成功执行。: ArrayBlockingQueue , LinkedBlockingQueue , PriorityBlockingQueue , DelayQueue , SynchronousQueue , LinkedTransferQueue , LinkedBlockingDeque
Thread+Handler与Async Task二者的差异在什么地方,AsyncTask的优缺点是什么
(1)AsyncTask 提供了像onPreExecute, onProgressUpdate这类的快速调用方法,可以被UI线程方便的调用,Thread没有。
(2).AsyncTask 不能重复运行, 一旦执行过了,你需要下次需要时重新创建调用。 thread 可以创建成在队列中获取workitem持续调用的模式,不停地执行。
(3)AsyncTasks的执行优先级是3.0, 默认的执行模式是一次一个任务;thread的执行则与其它线程无关。
(4)AsyncTask 写起来较快, Thread则需要多做一些工作。
(5)AsyncTask 的线程池大小是
CORE_POOL_SIZE = Math.max(2, Math.min(CPU_COUNT - 1, 4));
MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
6.Binder机制,binder底层实现,什么是UID/PID?
写一个 notification 的实例
7.View的绘制流程,Touch的分发机制,动画
7.1Activity Window View 三者差别,
7.2View的生命周期,回调方法
7.3view.post()
7.4RequestLayout,onLayout,onDraw,DrawChild区别和联系
7.5View刷新机制,优化自定义view
7.6视图,A嵌套B,B嵌套C,B,C都可滑动,滑动最里面的C,划到边界,B,C怎么动
7.7Android属性动特性,动画原理,自定义动画
7.8自定义View导致内存抖动
7.9内存抖动是由于短时间内有大量对象进出Young Generiation区导致的,它伴随着频繁的GC。
- 尽量避免在循环体内创建对象,应该把对象创建移到循环体外。
- 注意自定义View的onDraw()方法会被频繁调用,所以在这里面不应该频繁的创建对象。
- 当需要大量使用Bitmap的时候,试着把它们缓存在数组中实现复用。
- 对于能够复用的对象,同理可以使用对象池将它们缓存起来。
总之,因为内存抖动是由于大量对象在短时间内被配置而引起的,所以我们要做的就是谨慎对待那些可能会大量创建对象的情况。
网络,OKHttp,volley,缓存,MVC,MVP,MVVM
描述一次网络请求流程
网络传输协议,xml,json,protobuf
EventBus 的实现原理
okHttp 连接池。
OKHttp 和 volley,OKHttp在使用中遇到的坑。为什么选择OkHttp?
OKHttp,网络图片下载,缓存,图片压缩方法,适配方法,缓存方法
谷歌图片加载,缓存
jdk1.7和jdk1.8区别
1.8中Switch语句支持string类型
Try-with-resource语句
hashmap在1.8之后的冲突达到8之后,采用红黑树结构
用户态和内核态的区别
软引用和弱引用的区别
app优化
ANR问题的产生和如何解决,包括看什么log,ANR定位和修正
什么情况导致OOM
ANR问题,如果我在一个 thread 线程里面开启一个服务,会导致ANR问题吗?
hashmap, arraylist,linklist 他们的查找 和 修改数据 的时间复杂度分别是多少?
讲解一下GC垃圾回收机制
如果在静态方法中开启一个线程,等到静态方法运行结束后,这个线程会不会销毁?
线程与进程的区别?
线程池
ThreadPoolExecutor,
什么时候使用线程池?
单个任务处理时间比较短
需要处理的任务数量很大
联系到Drive上就是每个Worker对应一个DriveTaskManager ,使用饿汉的单例模式来进行获取,做多五个线程。
跨进程通信的方式?
thread和runnable的区别
Thread,则不适合资源共享。
Runable,则很容易的实现资源共享。
开启线程的三种方式
所有的线程对象都必须是Thread类或其子类的实例。
继承Thread ,重写run,并且使用.start()方法
实现runnable ,重写run,并且使用.start()方法
使用Callable和Future创建线程
synchronized相关,两个函数都加synchronized,是否互相影响
为什么要在变量singleton之间加上volatile关键字。要理解这个问题,先要了解对象的构造过程,实例化
hashtable为什么线程安全,我回答的是加锁了,他又问怎么加的锁
进行线程同步的方式有哪些?
为何要使用同步?
java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),
将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用,
从而保证了该变量的唯一性和准确性。
除了四大组件的跨进程通信,还有吗?
同步方法
即有 synchronized 关键字修饰的方法。
同步代码块
即有 synchronized 关键字修饰的语句块。
使用特殊域变量(volatile)实现线程同步
private volatile int account = 100 ;
RecyclerView和ListView的区别,为什么要用RecyclerView
ListView RecyclerView 如何加载不一样的item布局,哪个函数式绑定布局,哪个函数式绑定数据;ListView优化方案,多种。RecylerView对比ListView的优点。
ViewHolder模式提高效率,
Flowlayout怎么实现的
有没有解决过滑动冲突
ScrollView中嵌套了ListView
1.使用LinearLayout取代ListView
2.自定义可适应ScrollView的ListView,通过重写其onMeasure方法
处理方法
1.通过Activity计算item的高度,重新布局
2.自定义ListView,重写onMeasure方法
滑动问题:
原因:listview显式不全,
注意点1.一次完全触摸事件全部在listView覆盖范围,
2.设置父控件不拦截,getParent().requestDisallInterceptRouchEvent(true)
该方法是子控件命令父控件是否拦截的
RecyclerView缓存fail
处理方法:
1.设置setOnTouchListener(),监听到ACTION_UP事件时请求父控件不拦截
2.自定义ListView,重写分发拦截
怎么处理Crash问题
文件的权限使用
抽象类和接口的区别
接口:默认 方法属性public abstract,变量public static final,
抽象类:都可以(除了private)
类可以不实现抽象类和接口中的所有方法,但是这样的话,类必须声明是抽象的
都不可以被实例化
各种数据存储的安全性
Android 4.4 到5.0 什么区别
CANCLE事件应用场景
List和Map是否线程安全,别的集合哪些是线程安全的,如果非用这两种,如何做到线程安全。
考察 子类和父类 以及内部类 静态内部类 构造方法的调用先后顺序(new 一个子类)
手写android中包含Context的单例模式
手写双重校验锁的单例模式 解释原理 什么情况下会单例失败
一个对象其实可以分为三个步骤:
(1)分配内存空间。
(2)初始化对象。
(3)将内存空间的地址赋值给对应的引用。
但是由于操作系统可以对指令进行重排序,所以上面的过程也可能会变成如下过程:
(1)分配内存空间。
(2)将内存空间的地址赋值给对应的引用。
(3)初始化对象
onDestory里面都进行了什么回收操作
Invalidate和postInvalidate区别和使用
Android为每个应用程序分配的内存大小是多少
猿辅导:
TCP
三次握手流程
client server
——> SYN, seq x
SYN, seq y, ACK x+1 <——-
——> ACK y+1
为什么需要三次连接,两次会有什么问题?
server无法确认是否可以连接到client,不可靠
导致server随便遇到一个延迟的SYN消息,就回复ACK认为建立连接,不可靠
第一次 SYN失败会怎样
不断重试
第三次失败(如果一直收不到ACK会怎样)
如果客户端会再次发送数据,则建立连接
如果客户端没有数据,则服务器会超时重发SYN
超时断开,(浪费资源,DDOS/SYN攻击)
seq序列号是怎么定的,x是什么,y是什么,握手数据包里带有什么信息
TCP报文内容/信息
源端口号。 目的端口号
序号seq
确认号ack
标记位/ACK/SYN/FIN
window
数据
四次挥手
——> FIN ,seq x
<—— ACK, x + 1
<—— FIN, seq y
——> ACK, seq y+1
为什么需要四次全双工TCP,单方可以断开发送,仍可接受另一方发送
最后一个ACK回复后会有一段等待时间
滑动窗口
保证数据到达的顺序,管理发送速率
糊涂窗口
发送窗口,接受窗口,对应window字段
拥塞控制
慢启动
快恢复
HTTP/HTTPS
在tcp/ip协议族的哪一层
区别
https原理,如何进行加密和解密
https的优缺点
加密机制:对称与非对称加密混合
报文结构,请求报文,响应报文,知道哪些字段
方法,GET/POST有神马区别
cookie,session,为啥需要cookie,cookie里都有写什么,cookie是怎么被设置到客户端上的
name/value/domain/path/expire/
HTTP 响应报文中的 set-cookie 首部行,可以追加式或覆盖式地设置 Cookie,使用多个 set-cookie 行
状态码,2xx,3xx,4xx,5xx对应什么
操作系统
进程与线程
text region、data region stack region
进程的几个状态:等待,就绪,运行
进程的调度:FIFO,Shortest Job First,Round-Robin时间片轮转,多级队列
进程间通信,
线程可以共享什么
a.地址空间和其它资源:进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
b.通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
c.调度和切换:线程上下文切换比进程上下文切换要快得多。
锁
共享锁-独占锁,信号量
互斥锁(另一线程被挂起),自旋锁(轮训等待)
重入锁,不可重入锁
读写锁,同时读,写互斥
堆区和栈区有神马区别
大小端是什么 0x123456
大端:
12 - 34 -56 - 78
00,01,02,03
小端78-56-34-12
00-01-02-03
如何用代码测试
hashmap的原理
C++
指针和引用的区别
什么是多态,cpp里的多态的实现
const int * foo; int * const bar;
Malloc/new
虚函数/纯虚函数
const和define
inline
struct和class的却别
using
第一部分,编码实现考察Math.max在一个升序无重数组中查找目标元素出现的位置计算二叉树宽度非递归实现二叉树镜像判断二叉树是否是平衡二叉树C-Style 字符串反转判断一个字符串是否是镜像字符串逆序打印链表模拟一个编辑器:输入是一个字符串,L代表光标左移,R代表光标右移,B(back) 代表向前删除,D代表向后删除,其他字符都是正常输入,给出输出字符串。 本题思路很明确,但是细节、边界很多,属于偏难的题。单链表表示的大整数+1ip地址去掉点构成一个字符串,给定字符串,返回全部可能的ip地址。第二部分,思路考察在一个升序有重数组中查找目标元素第一次出现的位置通过一个数组,实现两个栈,实现 pushLeft/pushRight/popLeft/popRight只利用栈结构对已有的数字栈排序LRU Cache第三部分,设计题滴滴打车在一个 n * m 的矩阵上随机散落一些点作为司机矩阵上一随机点为乘客司机和乘客位置不移动某一时刻,乘客发出打车请求司机随机地选择接单或不接单,司机的响应时延也是随机的业务期望最终成单时满足两个特性:只有一个司机接单成功尽可能地把单排给距离乘客比较近的司机问题:设计一个流程,满足上述约束条件设计一个系统,实现你设计的流程一些可以追问的问题:如果司机几千万,n 和 m 都会大,乘客并发 qps 很高的情况下,如何优化系统?如何下发通知给司机?乘客订单可能处于那些状态?这些状态下系统都处于什么样的情况?画出状态转移图高可用?缓
优化:
三星云,布局重用,种类标签用的ViewStub懒加载,占内存比较小,viewStub.inflate()。对ViewStub的inflate操作只能进行一次,被替换后就没有ViewStub控件了
过度绘制:扁平化 , DDMS工具,增强渲染,开发者选项,显示布局边界。移除不必要的背景,在移除 ViewPager 和 Activity 根布局的白色背景
绘制优化:ondraw不能创建对象,不能做耗时的操作
内存泄露:handler,AsyncTask(静态+弱引用),
RecyclerView: ViewHolder,异步加载(耗时的操作开线程),滑动停止加载。停止,滑动,甩动,甩动停止加载。
BitMap 优化:压缩图片,由于云端缩略图太大,自己本地写了缩略图,用的RGB_565方法。
性能优化:采用线程池,上传下载
图片缓存:1.一级缓存在cache集合中用KEY值查找,有:显示否则进入二级查找。2.二级缓存在本地SD卡中是否有图片路径,有:显示并添加到一级缓存,否:进入三级请求。3.三级缓存通过URL网络请求加载,有:显示并添加到一二级缓存中,否则显示错误加载图片
算法面试:
- 手写冒泡排序
- 二叉树的用途
- 平衡二叉树
- 手写链表反转
N1->N2->N3->N4
public static Node reverse2(Node head) {
if (head == null)
return head;
Node pre = head;// 上一结点
Node cur = head.getNext();// 当前结点
Node tmp;// 临时结点,用于保存当前结点的指针域(即下一结点)
while (cur != null) {// 当前结点为null,说明位于尾结点
tmp = cur.getNext();
cur.setNext(pre);// 反转指针域的指向
// 指针往下移动
pre = cur;
cur = tmp;
// 最后将原链表的头节点的指针域置为null,还回新链表的头结点,即原链表的尾结点
head.setNext(null);
return pre;
}
-
二叉树遍历(不写代码) 前序+中序 给出前序和中序 如何得到树
-
输入字符串,判断是否是IP地址
验证是否为ip地址,查看的是String字符串的用法,用str.split(‘.’)分开
重要的是str的判断机制,满足IP地址。 -
93&-10
-
给出一串数字,输出连续数列的最大长度 1 2 3 4 6 8 100 200 返回4
-
算法题:输入是一个字符串,大小写错乱,空格错乱
例如“tHis iS my FRIEND JaCk ”
要求输出规则,基数字符的首字母大写,剩下全部小写,各个字符之间只能有一个空格,首尾没有空格。时间复杂度要求O1(他也说了空间复杂度,我忘记了。总感觉时间复杂度O1实现不了)
例如“This is My friend Jack”
开启三个线程,输出1A,2B,3C,1D,2E…
sharedpreferenced 提交方式与区别
pause 和 stop的区别:只pause 失去焦点,activity仍热继续,有滑动仍然会滑动;stop是暂停,activity暂停状态
断点续传的实现原理
android源码中,那些用到了观察者模式
插件化,
handler系统时间
桌面启动activity过程,setcontentView
动画原理
网络库
图片库
长链接:维护长链接,心跳,保活,封包拆包
跨进程同步数据,加锁的方式, mmkv
实时生效
java内存模型
动态代理
aop
inflater
列表卡片优化(方案,信息同步,间距)
动态代理
类加载过程
aop处理方案
AMS插桩
anr产生原因,问题定位,
Android/iOS常用API使用
findViewById源码
findViewById --》 findViewTraversal -->
OkHttp原理分析
View的加载流程(源码)
handler的延迟发送机制
音频流视频流的相关
RXjava,等api
各种设计模式
原子性:就是说虚拟机在执行一个Java指令时,是否能保证 一个线程 必须执行完 一个Java 指令 后才能被其他线程 抢走CPU执行权。注意,是Java指令。
内存泄露,内存抖动,内存溢出
自定义View导致内存抖动
三方api
两个线程,一个sleep2S,一个delay3S,执行顺序
handler延迟机构,调时间
setContentView
View的绘制流程,view的遍历流程:深度还是广度
自定义view,三个方法
hashmap红黑树,界限8,超过8就会变成红黑树
红黑树原理:自平衡的二叉查找树,
性质1. 节点是红色或黑色。
性质2. 根节点是黑色。
性质3 每个叶节点(NIL节点,空节点)是黑色的。
性质4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
性质5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
图片压缩到固定大小
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//200kb
Bitmap bitmap= compressImage(200*1024,"图片路径");
}
public static Bitmap compressImage(long size,String image) {
try {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;//只测量image 不加载到内存
BitmapFactory.decodeFile(image, options);
options.inPreferredConfig = Bitmap.Config.RGB_565;//设置565编码格式 省内存
int height = options.outHeight;//图片的高度 单位1px 即像素点
int width = options.outWidth;//图片的宽度
int inSampleSize = 1;//压缩比
//通过所需大小计算压缩比
while (((width / inSampleSize) * (height / inSampleSize)) >= size) {
inSampleSize *= 2;
}
options.inSampleSize = inSampleSize;//获取压缩比 根据当前屏幕宽高去压缩图片
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(image, options);
} catch (Throwable e) {
}
return null;
}
2020.06.16小米,百度
Android基础:
-
startActivity
-
广播的种类,分别怎么实现广播
静态(AndroidMenifest.xml中配置,添加过滤器)
动态(intentFilter.addAction)
本地广播的实现是handler,全局广播的实现是binder -
服务:什么情况下使用startService,什么情况下使用bindService,有什么区别
-
tartService启动过后,用stopService来结束service,调用完之后就与调用者无关了,记得服务完毕后及时关闭,startservice并不能解决我们所有的需求,比如,我有时候,需要service的返回结果,我需要和service交互,startservice显然不能完成。那么我们可以使用到bindservice
-
Activity和Service的通信方式
intent,通过binder(binderservice),广播 -
binder的四个重要组成部分:C,S,Binder驱动,ServiceManager,各自的作用
C:客户端,S:服务端,
Binder驱动:
ServiceManager:在service使用前,必须要在ServiceManager中进行注册,返回一个handle,handle是位移标识符 -
binder能传什么东西,AIDL文件的写法与限制
基本数据类型(short 除外)、String、charSequehce、List(元素得序列化)、Map(元素得序列化)、parcelable。
aidl方法传入自定义类对象,in、out、inout必须写(aidl默认支持的类型不用写,默认且只能是in),否则报错。 -
binder机制,服务端是在什么线程中的(服务端的子线程池)
客户端调用远程服务方法,同时客户端线程会被挂起,如果服务端被调用的方法比较耗时,那么就要避免在客户端UI线程中访问远程方法;
由于服务端的方法在服务端的Binder线程池中运行,所以方法本身可以进行大量耗时操作,所以切记不要在服务端方法中开线程进行异步任务; -
MVC和MVP架构(M,V,P都放什么)
M(Model)
数据层,和MVC中的M一样,用来放数据的处理(比如网络请求,缓存等)。
V(View)
负责UI具体实现展现。比如Presenter派发过来一个动作是showDialog显示进度命令,那么我们这个View就负责实现具体UI。
P(Presenter)
负责处理业务逻辑代码,处理Model数据,然后将处理完的数据分发到View层。 -
Touch事件和click事件先后顺序
click包含down和up,所以在ontouch事件之后 -
handler如何实现所有的异常捕获
Thread.UncaughtExceptionHandler
实现思路
自定义CrashHandler实现接口Thread.UncaughtExceptionHandler
public class CrashHandler implements UncaughtExceptionHandler{
在应用Application初始化时替换系统默认的异常处理器
// 异常处理,不需要处理时注释掉这两句即可!
CrashHandler crashHandler = CrashHandler.getInstance();
// 注册crashHandler
crashHandler.init(getApplicationContext());
自定义CrashHandler需要做的工作:
收集设备信息、版本信息、异常信息
写入本地记录
上传到服务器 -
为什么要用状态机
在Android系统中,经常使用状态机来处理不同状态下的行为动作。状态机是将对象的状态与行为封装在一起;可以解决庞大的分支语句带来程序阅读性差和不便于进行扩展问题,使整个结构变得更加清晰明了,降低程序管理的复杂性提高灵活度。 -
加密类型,加密方式,Http和Https的区别,为什么Https安全
1对称加密:加密解密用同一个密钥,被黑客拦截不安全
2非对称加密:公钥加密,私钥解密;公钥可以公开给别人进行加密,私钥永远在自己手里,非常安全,黑客拦截也没用,因为私钥未公开。著名的RSA加密算法用的就是非对称加密。
http协议属于明文传输协议,交互过程以及数据传输都没有进行加密,通信双方也没有进行任何认证。
Https:密文,验证身份,非对称加密 -
ScrollView嵌套ListView,会发生什么(只有一个item),怎么解决
这种情况是当ScrollView嵌套ListView时,ListView的高度设置为wrap_content时会产生,一般情况下ListView只显示的第一个Item。
正常情况下,高度设置为“wrap_content”的ListView在测量自己的高度会使用MeasureSpec.AT_MOST这个模式高度来返回可包含住其内容的高度。
而实际上当ListView被ScrollView嵌套时,ListView使用的测量模式是ScrollView传入的MeasureSpec.UNSPECIFIED
解决方法一:覆写ListView的onMeasure方法:
解决方法二:在Activity中动态修改ListView的高度,注意当ListView的子item需要根布局是LinearLayout,或需要为一个View,因为有些布局中没有measure这个方法,比如RelativeLayout。
https://blog.csdn.net/cxmscb/article/details/52551065?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159232642919724835846581%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=159232642919724835846581&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_click~default-1-52551065.nonecase&utm_term=ScrollView%E5%B5%8C%E5%A5%97ListView
- 自定义View的OnMeasure方法
- 线程池相关,开启20个任务,线程池怎么分配
- Messager
Java基础:
-
多态
继承父类和实现接口 -
内部类和匿名内部类
https://blog.csdn.net/coding_1994/article/details/81154908?ops_request_misc=&request_id=&biz_id=102&utm_term=%E5%86%85%E9%83%A8%E7%B1%BB%E5%92%8C%E5%8C%BF%E5%90%8D%E5%86%85%E9%83%A8%E7%B1%BB&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-4-81154908
内部类:内部类可以是static的或者非static的,static内部类只能包含静态方法和静态类变量,只能访问外部类的静态元素,内部类可以实例化,多次使用。匿名内部类:它只能使用一次,不区分static和非static。如果用到外部类的变量的话,必须是类变量或者实例变量,就是必须是类定义的变量,或者final的局部变量。匿名内部类如果是继承某个类的话是可以重写那个类的方法的,这个和普通内部类一样。 总结:可以用匿名内部类的地方都可以用内部类替换,但是用匿名内部类编码非常简洁,也容易读懂,除非你需要多次使用那个内部类,不然建议还是使用匿名内部类。
-
异常处理机制
Exception和Error -
如何安全的使用hashmap
Sun的工程师建议,在这样的场景下应采用"ConcurrentHashMap"。
在"HashMap"数据结构操作方法上加"synchronized"。
ConcurrentHashMap
和HashMap功能基本一致,主要是为了解决HashMap线程不安全问题
java7中的基本设计理念就是切分成多个Segment块,默认是16个,也就是说并发度是16,可以初始化时显式指定,后期不能修改,每个Segment里面可以近似看成一个HashMap,每个Segment块都有自己独立的ReentrantLock锁,所以并发操作时每个Segment互不影响;java8中将Segment块换成了Node,每个Node有自己的锁,即每个Node都有自己的并发度;
不允许空值和空键,否则会抛出异常; -
反射
https://www.zhihu.com/question/24304289
//第一种方式:
Classc1 = Class.forName("Employee");
//第二种方式:
//java中每个类型都有class 属性.
Classc2 = Employee.class;
//第三种方式:
//java语言中任何一个java对象都有getClass 方法
Employeee = new Employee();
Classc3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee)
-
泛型
原文链接:https://blog.csdn.net/s10461/article/details/53941091 -
死锁是什么,怎么处理
-
GC相关,老年代,新生代
-
有没有重写过equals,怎么重写
-
为什么要重写equals()方法?
因为object中的equals()方法比较的是对象的引用地址是否相等,如何你需要判断对象里的内容是否相等,则需要重写equals()方法
重写equals()方法同时重写hashcode()方法,就是为了保证当两个对象通过equals()方法比较相等时,那么他们的hashCode值也一定要保证相等。 -
线程锁
-
jvm
-
动画
-
HTTP请求:
- 域名解析、
- TCP的三次握手、
- 建立TCP连接后发起HTTP请求、服务器响应HTTP请求、
- 浏览器解析html代码,同时请求html代码中的资源(如js、css、图片等)、最后浏览器对页面进行渲染并呈现给用户
-
synchronized修饰静态方法和普通方法的区别
synchronized修饰静态方法时,锁对象是class字节码文件对象,而两个对象是同一个class文件,所以使用的是同一个锁。
synchronized修饰普通方法时锁对象是this对象,而使用两个对象去访问,不是同一把锁。 -
Java中可作为gc root 的对象有哪些?
1 、 虚拟机栈(栈帧中的本地变量表)中引用的对象。
2、 本地方法栈中JNI(即一般说的native方法)引用的对象。
3、 方法区中的静态变量和常量引用的对象。
从程序的角度来说就是,找到一段程序运行的整个过程中始终会存活的对象,这些对象的特点是始终会存活,不会死亡。即一些静态变量 和常量所引用的对象等。 -
AMS
-
WebView
-
Context(Activity,Application,Service)
Activity.this和getApplicationContext()返回的不是同一个对象,一个是当前Activity的实例,一个是项目的Application的实例,这两者的生命周期是不同的,它们各自的使用场景不同
凡是跟UI相关的,都用Activity做为Context来处理。
Context数量 = Activity数量 + Service数量 + 1 -
OKHttp
-
OnNewIntent
-
handler:post(Thread runnable;sendMessage);IdleHandler
PostMessage 只把消息放到队列,不管消息是不是被处理就返回,消息可能不被处理;
SendMessage等待消息被处理完了才返回,如果消息不被处理,发送消息的线程将一直处于阻塞状态,等待消息的返回。 -
Arraylist,LinkList,HashMap,HashTable,ConcorrentHashMap,SparseArray原理,扩容,线程安全,怎么实现
-
synchronized,voliate机制,原理
-
Intent源码
-
Messager,Binder
-
分析ANR等问题
anr操作流程
app版本
分支代码,代码逻辑
log信息,包名,方法名
复现问题
打印调用栈 -
定位原理
-
网络,安全
-
新版本安卓的内容
-
内存泄露工具(DDMS+MAT)
-
try – finally的return机制
-
强软弱虚内存回收的表现,什么时候会OOM
-
值传递和引用传递
-
+=具备强制类型转换(java是个强类型的语言,区别于C,C++,Python)
-
Jvm加载类的过程(main–》new),怎么找到类
-
activity,点击back的生命周期
-
px,dpi,dp,sp区别,和换算
-
OOM(OutOfMemory)和SOF(StackOverFlow)
OOM:
先讨论第一种情况,即经jstack或dump后,线程的数量确在系统要求的阀值内,报上面异常,该如何?
1.参考之前的参数,可以修改两个变量JVMMemory和ThreadStackSize来满足更多线程创建的要求。
-Xss1024k -Xms4096m -Xmx4096m
第二种情况,是程序中存在线程泄露,代码本身有问题,在某些场景,条件下存在线程不断创建而不销毁的BUG。
1、线程池不管理式滥用
2、本地缓存滥用(如只需要使用Node的id,但将整个Node所有信息都缓存)
3、特殊场景考虑不足(如采用单线程处理复杂业务,环境震荡+多设备下积压任务暴增)
- APP改包名应该注意的点 ,Gradle开发
第一步:
在Android Studio中,右击包名,选择refactor name,确定更改。
新版的AS当中,自定义View的引用中的包名也会一致更改。
第二步:
手动更改:Manifest文件,build.gradle中的包名相关
第三步:
查找静态字段,文件存储等包名相关的地方
第四步:
更改混淆文件中涉及到的包名 - 观察者模式