Android面试的一些问题

一,说一下StringBuffer和StringBuilder的区别。
答:1.StringBuffer是线程安全的,因为StringBuffer所有公开方法都是使用synchronized(用来控制线程同步的)修饰的。而StringBuilder并没有使用synchronized修饰。
2.因为 StringBuffer 是线程安全的,它的所有公开方法都是同步的,所以使用会降低性能,StringBuilder 是没有对方法加锁同步的,所以StringBuilder 的性能要远大于 StringBuffer。
3.所以,在单线程情况下,推荐使用StringBuilder,在多线程情况下要求线程安全的话就必须使用SreingBuffer。

二,说一下Recyclerview和ListVIew的区别
答:1.缓存机制的区别,Recyclerview比ListView多两级缓存,RecyclerView离屏获取缓存的时候无需重新bindView,而ListView进行离屏缓存时,是根据pos先获取到相应的缓存,但是没有直接使用,而是getView,择必须重新bindView,
2.局部刷新,更大的亮点在RecyclerView提供了局部刷新的接口,这样可以避免调用很多无用的bindView,ListView和RecyclerView最大的区别在于数据源改变时的缓存的处理逻辑,ListView是将所有的mActiveViews都移入了二级缓存mScrapViews,而RecyclerView则是更加灵活地对每个View修改标志位,区分是否重新bindView。

三,说一下handler机制(这个东西太多了,我也不太能讲通)
答:1,消息传递机制,handler的作用有两个,发送消息和处理消息,它能实现两个线程之间消息的传递,我们使用handler 的时候会先新建一个handler,然后去重写它的的handlerMessage。下面是我之前写的一小段使用代码,用的是Kotlin

    private var handler: Handler = Handler(Looper.getMainLooper()) {
//        override fun handleMessage(msg: Message) {
//            super.handleMessage(msg)
//            when (msg.what) {
//                1 -> preview()
//                2 -> stopPreview()
//            }
//        }
        when (it.what) {
            OPEN -> preview()
            CLOSE -> stopPreview()
        }
        false

可以看出来有一个Message,这就是其他handler传过来的消息,然后我们根据消息类型去做相应的处理。
我的理解是handler把消息发送到指定的MessageQueue(消息处理队列)中,然后消息队列是使用Looper来关联的,Looper中使用Loop方法开启了一个死循环,Loop不停把消息取出来,然后通过handler传回相应的handler线程。

四,activity生命周期以及页面横竖屏切换时antivity生命周期的变化.
答:一共七个阶段:
onCreate(初始化活动)
onStart(当activity对用户可见时会调用onStar)
onResume(当activity开始与用户交互时会调用)
onPause(不管是这个activity要销毁还是要暂停或停止,都会调用该方法)
onStop(当这个activity完全看不见的时候,会调用onStop方法)
onDestroy(activity销毁前执行的最后一个方法)
onRestart(把activity从onStop状态唤醒时,会用onRestart方法,该方法优先于再次运行的onStart,运行完onRestart)
页面横竖屏切换时:
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

五,讲讲你做过的性能优化。
答:1,布局优化:减少布局的层级,多使用include复用,删除无用控件,显示的属性尽量在代码中完成,少使用wrap_content,避免程序大量计算损耗性能。
2,流畅性优化:避免在onCreate内做耗时操作,耗时操作放在子线程中完成。
3,内存优化:避免无用属性的申请,使用内存检测工具分析问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旧人颜Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值