专栏名称: 复利大王
分享和推送Java/Android方向的技术和文章,让你成为这方面的大牛,让你每天都成长一点。同时,我们也会邀请BAT的大牛分享原创!
目录
相关文章推荐
鸿洋  ·  腾讯 ovCompose ... ·  19 小时前  
复利大王  ·  某公募研究员ED? ·  昨天  
鸿洋  ·  全新导航库 Jetpack ... ·  昨天  
复利大王  ·  国产美女宁宁 ·  昨天  
51好读  ›  专栏  ›  复利大王

写在Android面试回来后【可能最全的Android面试总结】

复利大王  · 公众号  · android  · 2016-12-02 11:29

正文

请到「今天看啥」查看全文


然后Handler机制大约是这样的:首先Handler发送一个消息MessageQueue里面,然后通过Looper的loop方法进行无限循环,如果产生了一个新消息,那么就调用handler的handlermessage方法进行余下的操作。之所以这样做的原因是因为避免多线程并发更新UI线程所产生的问题的,如果我们允许其他子线程都可以更新界面,那么势必会造成界面的错乱(因为没有加锁机制),如果我们加锁,又会影响速度,所以,只能在主线程即UI线程里面更新界面。

面试题:只能在UI线程里面更新界面吗?

答: 不一定,之所以子线程不能更新界面,是因为Android在线程的方法里面采用checkThread进行判断是否是主线程,而这个方法是在ViewRootImpl中的,这个类是在onResume里面才生成的,因此,如果这个时候子线程在onCreate方法里面生成更新UI,而且没有做阻塞,就是耗时多的操作,还是可以更新UI的。

面试题:Android子线程更新UI的方式有几种?

答: 一般情况下,我们都采用Handler的方式进行更新UI,当然,代码层的实现有不同的方法,比如可以使用Handler的post方法进行更新UI,或者用Handler的sendMessage方法进行更新UI,或者通过View的post方法进行更新,还有一个是runOnUIThread也是可以进行更新的。但这些本质上还是通过Handler进行子线程的更新。

面试题: 使用Handler的时候一般会遇到什么问题?

:比如说子线程更新UI,是因为触发了checkThread方法检查是否在主线程更新UI,还有就是子线程中没有Looper,这个原因是因为Handler的机制引起的,因为Handler发送Message的时候,需要将Message放到MessageQueue里面,而这个时候如果没有Looper的话,就无法循环输出MessageQueue了,这个时候就会报Looper为空的错误。

面试题:你知道HandlerThread是什么吗?

:HandlerThread是Android官方给我们提供好的一套子线程的Handler,也就是异步处理机制,它是为了避免线程切换导致空指针异常的错误。

面试题:怎么在主线程中通知子线程?这样做有什么好处?

答: 可以利用HandlerThread进行生成一个子线程的Handler,并且实现handlerMessage方法,然后在主线程里面也生成一个Handler,然后通过调用sendMessage方法进行通知子线程。同样,子线程里面也可以调用sendMessage方法进行通知主线程。这样做的好处比如有些图片的加载啊,网络的访问啊可能会比较耗时,所以放到子线程里面做是比较合适的。

面试题:异步处理有几种方式?

答: 可以采用Handler的形式,利用官方提供的HandlerThread类进行声明一个子线程的Handler,然后在Handler里面就可以做耗时的操作了,注意,需要在子线程中提前准备好Looper对象,可以使用Looper.prepare方法,最后需要使用Looper.loop方法进行循环。还可以直接用AsyncTask进行操作,一般会构造函数有三个参数,一个是传入参数,一个是进度,还有一个是结果,然后一般会实现一些方法,比如:execute用来用来执行一个异步任务,就是实现的AsyncTask的类调用的,还有onPreExecute,就是调用后立即执行,doInBackground,在onPreExecute完成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。onProgressUpdate,可以直接将进度信息更新到UI界面上。onPostExecute,后台结束时候调用的方法,会返回结果。注意,不能执行多次,不然会报错,且必须在UI线程中调用,至于上面提到的方法都不要手动调用。doInBackground方法中不可以更新UI。

(因为Android3.0以后必须要求网络访问在子线程中,不然会抛NetworkOnMainThreadException异常,尝试ANR现象(5秒不响应现象))

面试题:Android中有几种布局?

答: Android中一般有五种布局,首先比较常用的两种布局是LinearLayout和RelativeLayout,就是线性布局和相对布局,线性布局的话一般是指定方向,然后从左往右或者从上往下排列的,相对布局的话是依赖与父控件或者其他View进行确定位置的。然后还有FrameLayout,TableLayout和AbsoluteLayout,其中FrameLayout就是一层一层的叠加的,TableLayout有点类似与HTML的表格,然后AbsoluteLayout的话是通过坐标确定位置的,因为Android屏幕多种多样,所以一般都不推荐用绝对布局。

面试题:说下Activity的生命周期。

答: Activity的生命周期是这样的,首先当用户启动一个Activity的时候,就会调用onCreate的方法,这个时候一般把要初始化的东西都放到这里,接着就会调用onStart方法,这个时候如果需要监听UI的变化或者数据的变化,一般可以放到这里,然后执行onResume方法,这个时候界面就已经显示好了。然后如果这个时候按了home键的话,就会调用onPause方法,接着是执行onStop方法,这个时候可以取消或停止刚才监听的UI或数据变化的监听器,接着如果这个时候你返回到刚才的Activity的话,可能产生两种情况,一种就是因为系统回收了你的Activity,这个时候就重新执行onCreate onStart onResume,如果系统没有回收你的Activity的话,就执行onRestart onResume方法,如果这个时候又不想回去,刚好内存不够了,就会执行onDestory方法进行销毁。







请到「今天看啥」查看全文