Android面试笔记四:航天精一

2019-04-15 23:55 阅读 728 次 评论 0 条
  1. 线程中sleep、wait、notify、yield和join的用法和区别
  2. Android执行GC在什么情况下会造成内存泄露
  3. manifest.xml文件的作用
  4. 描述一下常用的五种布局及其区别

问题一

线程的状态分为:
NEW——>RUNNABLE——>BLOCKING——>WAITING——>TIME_WAITING——>TERMINAL

sleep,线程进入阻塞状态,这时候的线程仍然持有同步方法或同步代码块的对象锁。当阻塞的时间到了,线程从阻塞状态进入就绪状态,否则一直阻塞。

wait,在同步代码块或同步方法里面调用,线程进入等待状态,这时候的线程释放了对象锁。等待的时间到了或者调用了notifynotifyAll方法,线程重新进入就绪状态,这时候的线程需要重新获得对象锁,才可以继续执行

notify,通知等待状态的线程可以进入就绪状态了

yield,暂停当前正在运行的线程并释放cup资源,让同等优先级的线程获取运行的机会,但也可能没有效果

join,主线程同时启动子线程t1、t2,分别调用join()方法,子线程执行完成后,join立即返回;否则,t1一直阻塞,t2线程阻塞,主线程无法获得执行的机会

Thread t1=new Thread(new Task());
t1.start();
Thread t2=new Thread(newe Task());
t2.start();

while(true){
    try{
        t1.join();
        t2.join();
    }catch(InterruptException e){
        e.printStackTrace();
    }
}

Thread.join的真正含义
https://blog.csdn.net/programmer_at/article/details/78934278

问题二

内存泄露的原因:长生命周期的对象持有的短生命周期的引用,短生命周期对象终止后,没法被垃圾回收器回收。当频繁地创建同对象时,大量的对象占据堆内存,最终可能造成OOM,内存泄露是造成OOM的主要原因之一。

  1. 单例生命周期和应用程序的生命周期一样长,如果传入一个Activity Context会造成内存泄露
  2. 非静态内部类实例化后赋值给一个静态变量,因为非静态内部类会持有外部类的引用
  3. Handler声明成内部类的形式或匿名类的形式,会持有外部类的引用(比如:Activity Context),Message持有Handler的引用,同时Message存放到消息队列中,等待执行。在消息执行之前,退出了Activity,因Message间接持有Activity的引用,造成Activity不符合回收标准,形成内存泄露
  4. 注册观察者模式时(比如:BroadcastReceiver、Service),在退出时,不要忘记了解除注册
  5. Bitmap对象占据的堆内存很大,使用结束后,除了调用recycle()方法释放内存外,也需要将Bitmap对象置null,更符合垃圾回收器标准,否则可能造成OOM
  6. 资源使用完,未及时关闭,比如:Cursor、File、Stream、Bitmap
  7. WebView造成内存泄露的原因:Android 5.1版本,调用了registerComponentCallbacks()注册了某个东西,未来得及反注册调用unregisterComponentCallbacks(),造成内存泄漏。解决版本,将WebView从父容器中移除,然后执行WebView相关方法
  8. MVP框架,P层以弱引用的方式传入Activity Context对象,防止耗时操作时,造成P层持有Activity引用,造成内存泄漏

WebView内存泄漏解决方法
https://blog.csdn.net/xygy8860/article/details/53334476
webview内存泄漏终极解决方案
https://www.jianshu.com/p/aa5a99b565e7

问题三

  1. 声明应用程序需要的基本信息:权限、包名、target sdk版本、min sdk版本
  2. 声明应用程序系统软硬件环境
  3. 声明主程序application属性
  4. 配置应用程序组件信息:Activity、Service、BroadcastReceiver和ContentProvider
  5. 配置参数内容:meta-data

问题四

  • ConstraintLayout,约束布局,减少嵌套层级,优化绘制过程,推荐使用
  • LinearLayout,线性布局,简单地垂直方向和水平方向摆放控件
  • RelativeLayout,相对布局,实现稍微复杂一点的布局,性能略逊于线性布局,但比较灵活
  • FrameLayout,帧布局,后一个控件遮盖前一个控件,实现层叠效果
  • AbsoluteLayout,绝对布局,使用得比较少
关注公众号 扫一扫二维码,加我QQ

如果文章对你有帮助,欢迎点击上方按钮关注作者

来源:TeachCourse每周一次,深入学习Android教程,关注(QQ158#9359$239或公众号TeachCourse)
转载请注明出处:https://www.teachcourse.cn/2738.html ,谢谢支持!
分类:面试题汇 标签:
Android学习笔记二:JVM内存模型 Android学习笔记二:JVM内存
初学Android Studio项目结构第一课 初学Android Studio项目结构第
你会错过的接口理解三部曲:定义,设置和实现 你会错过的接口理解三部曲:定义
Android开发之TextView控件设置颜色切换器的问题 Android开发之TextView控件设

发表评论

呲牙 憨笑 坏笑 偷笑 色 微笑 抓狂 睡觉 酷 流汗 鼓掌 大哭 可怜 疑问 晕 惊讶 得意 尴尬 发怒 奋斗 衰 骷髅 啤酒 吃饭 礼物 强 弱 握手 OK NO 勾引 拳头 差劲 爱你

表情