面试笔试1

1.请解释下在单线程模型中Message,Handler,Message Queue,Looper之间的关系。
 拿主线程来说,主线程启动时会调用Looper.prepare()方法,会初始化一个Looper,放入Threadlocal中接着调用Looper.loop()不断遍历Message Queue。
 Handler的创建依赖与当前线程中的Looper,如果当前线程没有Looper则必须调用Looper.prepare()。
 Handler通过调用sendMessage()方法讲消息放入MessageQueue中, MessageQueue是一个先进先出的队列,Looper不断从MessageQueue中取出消息,把消息交给消息对应的Handler对象进行分发处理。

2.内存溢出和内存泄漏有什么区别?何时会产生内存泄漏?内存优化有哪些方法?
 内存溢出通俗理解就是软件(应用)运行需要的内存,超出了它可用的最大内存。
 内存泄漏就是我们对某一内存空间的使用,使用完成后没有释放。
 内存优化:Android中容易内存溢出的部分,就是图片的加载,我们可以使用对图片的压缩并且使用LruCache缓存的目的来控制图片所能够使用的内存。对比较耗资源的对象及时的关闭,例如Database Conn ,流对象,游标,各种传感器,Service等等。

3.AsyncTask使用在哪些场景?它的缺陷是什么?如何解决?
 AsyncTask 运用的场景就是我们需要进行一些耗时的操作,耗时操作完成后更新主线程,或者在操作过程中对主线程的UI进行更新。
 缺陷:AsyncTask中维护着一个长度为128的线程池,同时可以执行5个工作线程,还有一个缓冲队列,当线程池中已有128个线程,缓冲队列已满时,此时如果仍然向线程提交任务,将会抛出RejectedExecutionException。
 解决:由一个控制线程来处理AsyncTask的调用判断线程池是否满了,如果满了则线程睡眠否则请求AsyncTask继续处理。

4.同一个程序,但不同的Activity是否可以放在不同的Task任务栈中?
 可以放在不同的Task中。需要为不同的activity设置不同的affinity属性,启动activity的Intent需要包含FLAG_ACTIVITY_NEW_TASK标记。

5.assets资源文件夹和res资源文件夹的区别?
 assets:所有资源不会在R.java文件下生成相应的标记,assets文件夹可以自己创建文件夹,必须使用AssetsManager类进行访问,存放到这里的资源在运行打包的时候都会直接打入程序安装包中,
 res:所有资源会在R.java文件下生成标记,这里的资源会在运行打包操作的时候判断哪些被使用到了,没有被使用到的文件资源是不会打包到安装包中的。资源会编译成二进制文件进行打包。
 在res文件夹下还可以定义一下目录: res/anim:这里存放的是动画资源。 res/xml:可以在Activity中使用getResource().getXML()读取这里的资源文件 res/raw:该目录下的文件可以直接复制到设备上,不能有子文件夹,编译软件时,这里的数据不需要编译,直接加入到程序安装包中,使用方法是getResource().OpenRawResources(ID),其中参数ID的形式是R.raw.XXX.

6.横竖屏切换时候Activity的生命周期?
 不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次。
 设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次。
 设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。4.0之后多配置一个属性screenSize。

7.AIDL的全称是什么?如何工作?
 全称是:Android Interface Define Language
 AIDL是一种接口描述语言。编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的. 如果需要在一个Activity中, 访问另一个Service中的某个对象, 需要先将对象转化成AIDL可识别的参数(可能是多个参数), 然后使用AIDL来传递这些参数, 在消息的接收端, 使用这些参数组装成自己需要的对象.AIDL的IPC的机制是基于接口,轻量级的。它使用代理类在客户端和实现层间传递值。
 使用AIDL, 需要完成2件事情: 1. 引入AIDL的相关类. 2. 调用aidl产生的class文件。

8.ANR异常是什么?如何解决?
 在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。所以一个流畅的合理的应用程序中不能出现ANR,而让用户每次都要处理这个对话框。因此,在程序里对响应性能的设计很重要,这样系统不会显示ANR给用户。默认情况下,在android中Activity的最长执行时间是5秒,BroadcastReceiver的最长执行时间则是10秒。
 ANR异常也是在程序中自己经常遇到的问题,主要的解决办法自己最常用的就是不要在主线程中做耗时的操作,而应放在子线程中来实现,比如采用Handler+mesage的方式,或者是有时候需要做一些和网络相互交互的耗时操作就采用asyntask异步任务的方式(它的底层其实Handler+mesage有所区别的是它是线程池)等,在主线程中更新UI。

9.OOM异常是什么?如何解决?
 OOM就是内存溢出,即Out Of Memory。也就是说内存占有量超过了VM所分配的最大。
 使用Bitmap的时候容易出现OOM
解决办法:
 进行图片压缩
 采用LruCache进行内存管理。LruCache实现原理是LinkedHashMap存储,当内存不够用的时候,将近期最少使用的数据从缓存中移除,保留使用最频繁的数据。
 异步加载。

10.做过哪些ListView的内存优化?
 复用convertView
 绑定ViewHolder,减少findViewById()的次数
 Listview的分页显示,实现上拉加载和下来刷新。
 网络图片的异步加载和三级缓存。

11.如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?
 onSaveInstanceState()方法
 当你的程序中某一个Activity A在运行时,主动或被动地运行另一个新的Activity B,这个时候A会执行onSaveInstanceState()。B完成以后又会来找A,这个时候就有两种情况:一是A被回收,二是A没有被回收,被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上了参数savedInstanceState;而没被收回的就直接执行onResume(),跳过onCreate()了。

12、NDK是什么?
 NDK是一些列工具的集合,NDK提供了一系列的工具,帮助开发者迅速的开发C/C++的动态库,并能自动将so和java 应用打成apk包。
 NDK集成了交叉编译器,并提供了相应的mk文件和隔离cpu、平台等的差异,开发人员只需简单的修改mk文件就可以创建出so。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

打不死的迪仔

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

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

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

打赏作者

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

抵扣说明:

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

余额充值