线程的阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。 主线程Looper从消息队列读取消息,当读完所有消息时,主线程阻塞。子线程往消息队列发送消息,并且往管道文件写数据,主线程即被唤醒,从管道文件读取数据,主线程被唤醒只是为了读取消息,当消息读取完毕,再次睡眠。因此loop的循环并不会对CPU性能有过多的消耗。
- RecyclerView相对ListView区别?
i.?布局效果上 ii.?缓存机制上 - Bitmap resize相关,设置option,decode
- 项目相关
- 用MultiDex解决何事?其根本原因在于?Dex如何优化?主Dex放哪些东西?主Dex和其他
Dex调用、关联?Odex优化点在于什么? - 答案:MultiDex解决方法数65535的限制问题,即方法数不能超过65535个;方法id是short类型4个字节来存储的,所以数目范围应在0-2^32即0-65535;MultiDex工作原理分析和优化方案; 主dex中:应用启动就必须加载的类,有一个keep文件来控制;其他dex文件都是通过主dex加载进来的;odex优化点:预加载;
- Dalvik和Art虚拟机区别?
- 多渠道打包如何实现(Flavor、Dimension应用)?从母包生出渠道包实现方法?渠道标识替换原理?
- Android打包哪些类型文件不能混淆?
a. 四大组件
- 架构
二面
- Glide缓存特点
- 问了擅长哪个方向?回答UI动画,所以就问UI相关的
- 算法题
public static void main(String[] args){ Counter counter=new Counter(); new Thread(new PrintOdd(counter)).start(); new Thread(new PrintEven(counter)).start(); }
static class PrintOdd implements Runnable { public Counter counter;
public PrintOdd(Counter counter) { this.counter = counter; }
@Override public void run() { while (counter.value<=100){ synchronized (counter){ if(counter.odd){ System.out.println(Thread.currentThread().getName()+":"+counter.value); counter.value++; counter.odd=!counter.odd; counter.notify(); } try { cou
《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享
nter.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } static class PrintEven implements Runnable { public Counter counter;
public PrintEven(Counter counter) { this.counter = counter; }
@Override public void run() { while (counter.value<=100){ synchronized (counter){ if(!counter.odd){ System.out.println(Thread.currentThread().getName()+":"+counter.value); counter.value++; counter.odd = !counter.odd; counter.notify(); } try { counter.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
static class Counter{ public int value = 1; public boolean odd = true; }
|