android 深入浅出 群内“每日一问” 问答总结


永远不变的就是变。


俗话说的好,环境改变人生。经常面对的是一群积极奋进的人,那么你的心态和生活也会变的充满斗志。青春在于折腾,趁我们还年轻,拿出你的激情,踏着泪水载着梦,才能拥有自己的一片天空。

上上上周,有机会加入了一个比较小的andorid 开发群,群内活力充足,每日有不常见面试题,深入android 源码的问题,由群主发起,各路大神讨论,为菜鸟(比如我)普及android知识。每日进步一点点,慢慢积累自己的财富~


本文收集题目来自:wing_Android 技术交流群(425983695),欢迎青春朝气的你加入。


1.merge标签的作用

如果出现静态页面加载也卡顿,一定是ui布局的层次关系没优化好,每增加一层布局,就会延迟界面显示。

<merge/> 标签主要用于android UI界面结构的优化,可以减少多余的层级,<merge/>多用于替换FrageLayout或者当一个布局包含另一个时候。  <merge/>标签可用于嵌套层的布局,例如你的主布局文件为垂直布局,引入一个垂直布局include ,这个include布局使用的最外层layout没意义还会增加主布局的层数,造成布局加载慢。
使用<merge/>标签,系统直接忽略merge节点,加载merge节点包含的其他控件。

2.view变化监听器ViewTreeObserver的使用

几个接口

interface  ViewTreeObserver.OnGlobalFocusChangeListener         
   //当在一个视图树中的焦点状态发生改变时,所要调用的回调函数的接口类   
interface  ViewTreeObserver.OnGlobalLayoutListener
   //当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时,所要调用的回调函数的接口类  
interface  ViewTreeObserver.OnPreDrawListener
   //当一个视图树将要绘制时,所要调用的回调函数的接口类   
interface  ViewTreeObserver.OnScrollChangedListener
   //当一个视图树中的一些组件发生滚动时,所要调用的回调函数的接口类   
interface  ViewTreeObserver.OnTouchModeChangeListener
   //当一个视图树的触摸模式发生改变时,所要调用的回调函数的接口类

使用方法和点击事件类似

3.activity生命周期由谁调用,或者说由谁管理

activityManageService  (查看源码可以看到)


4.什么叫进程

进程是系统进行资源分配和调度的一个独立单位,线程是CPU调度和分派的基本单位
进程和线程的关系:
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。
(3)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
(5)线程是指进程内的一个执行单元,也是进程内的可调度实体。
线程与进程的区别:
(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位。
(2
)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可以并发执行。
(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。
(4)系统开销:在创建或撤销进程的时候,由于系统都要为之分配和回收资源,导致系统的明显大于创建或撤销线程时的开销。但进程有独立的地址空间,进程崩溃后,在保护模式下不会对其他的进程产生影响,而线程只是一个进程中的不同的执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉
就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但是在进程切换时,耗费的资源较大,效率要差些。


5.抽象类和接口的区别

抽象类可以有非抽象方法

抽象类需要继承,且只能继承一个。
接口需要实现所有 未实现的方法,可以实现多个接口。

6.群友葫芦娃面试乐视题目

1.说说广播有哪几种启动方式,区别是什么
一是动态方式使用Context.registerReceiver()方法来注册;
二是静态方式,即在AndroidManifest.xml中通过<receiver> 。

2.service启动方式和区别

Service的生命周期方法onCreate, onStart, onDestroy

有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。

1. 通过startService

 Service会经历 onCreate -> onStart

 stopService的时候直接onDestroy

如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。下次调用者再起来可以stopService。

2. 通过bindService

Service只会运行onCreate, 这个时候服务的调用者和服务绑定在一起

调用者退出了,Srevice就会调用onUnbind->onDestroyed所谓绑定在一起就共存亡了。并且这种方式还可以使得
调用方(例如)调用服务上的其他的方法。

3.handler机制

4.了解过什么和屏幕适配和机型适配有关的
5.写个排序

7.UI线程和工作线程区别

Ui线程是安卓的主线程,不能做耗时操作或联网操作
主线程有内置looper,工作线程没有
主线程就是一个looper线程,  子线程不能修改ui是因为viewroot有一个checkThread函数来检查当前线程,如果是工作线程则抛出异常
 主线程的Looper,是在activityThread创建的

8.frgment意外销毁怎么恢复---------群友葫芦娃小米面试题

activity 会因为内存不足意外中止,那么activity里面的fragment怎么恢复呢?

在activity 的onSaveInstanceState() 方法中 通过FragmentManager 调用putFragment    ,保存fragment的状态
关于解答译文: http://blog.csdn.net/a940659387/article/details/50730076


9. 2.26群友葫芦娃群内提问

1.使用viewholder的时候,自己定义的class viewHolder需要static吗,为什么?

最好是静态的,非静态内部类要有外部类的对象才能被引用,需要实例化。静态内部类就不同了,不用外部类的额实例就能拿到。为了保证对象唯一节约资源。
打个比方:就和Activity中的handler一样,最好定义为静态的,这样即使handler没有执行完,Activity还是能被正常回收,不会导致内存泄露。
接憧而至第二个问题

2.为什么handler会导致内存泄露?
同一个线程的handler用的looper都是同一个,一个线程只有一个looper,消息中存在handler的引用,所以只要有runnable或者message,handler就无法被回收了。handler无法被回收,则引起当前使用handler的Activity无法被回收,因此即使执行了Activity的生命周期onDestroy,handler的引用还是存在的,时间长了,就出现了内存泄露。
总结:其实就是一个引用链,分别为:messagequeue message handler activity



以上内容由博主纯手工记录和部分问题整理。转载请注明出处:http://blog.csdn.net/qq_33078541?viewmode=contents


如你也是一个技术迷恋着,请加入我们的青春队伍~wing_Android 技术交流群(425983695)


  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值