天天看点

android 常见面试题(二)

介绍:

上一篇博客分享了一些面试题,今天接着分享一些常见的android面试题

1)什么是ANR 如何避免它?(Android线程间的通信方式 )

答:ANR:Application Not Responding(应用程序无响应).当出现下列情况时,Android就会显示ANR对话框了: 对输入事件(如按键、触摸屏事件)的响应超过5秒 意向接受器(intentReceiver)超过10秒钟仍未执行完毕Android应用程序完全运行在一个独立的线程中(例如main)。这就意味着,任何在主线程中运行的,需要消耗大量时间的操作都会引发ANR。

解决方案有两种:

1)AsyncTask异步任务中,doInBackground()和onPostExecute(Result)两个方法非常重要

doInBackground() 这个方法运行在后台线程中,主要负责执行那些很耗时的操作,如移动护理系统中的网络连接、解析XML等操作。该方法必须重载。

onPostExecute(Result) 这个方法也运行于UI线程,在doInBackground(Params…)方法执行后调用,该方法用于处理后台任务执行后返回的结果。

2) 子thread + handler

2)listview优化策略

答:1)对convetView进行判空,是当convertView不为空的时候直接重新使用convertView

从而减少了很多不必要的View的创建

2)定义一个ViewHolder,将convetView的tag设置为ViewHolder,不为空时重新使用即可

3)当ListView加载数据量较大时可以采用分页加载和图片异步加载

3)ListView分页加载实现思路

实现OnScrollListener 接口重写onScrollStateChanged 和onScroll方法,使用onscroll方法实现”滑动“后处理检查是否还有新的记录,如果有,调用 addFooterView,添加记录到adapter, adapter调用 notifyDataSetChanged 更新数据;如果没有记录了,把自定义的mFooterView去掉。使用onScrollStateChanged可以检测是否滚到最后一行且停止滚动然后执行加载

4)ListView图片异步加载实现思路

1)先从内存缓存中获取图片显示(内存缓冲)

2)获取不到的话从SD卡里获取(SD卡缓冲,从SD卡获取图片是放在子线程里执行的,否则快速滑屏的话会不够流畅)

3)都获取不到的话从网络下载图片并保存到SD卡同时加入内存并显示(视情况看是否要显示)

5)Intent的原理、作用、可以传递哪些类型的参数

intent是连接Activity, Service, BroadcastReceiver, ContentProvider四大组件的信使,,可以传递八种基本数据类型以及string, Bundle类型,以及实现了Serializable或者Parcelable的类型。

Intent可以划分成显式意图和隐式意图。

显式意图:调用Intent.setComponent()或Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。

隐式意图:没有明确指定组件名的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。

6)如何实现屏幕分辨率的自适应(布局、九线图、目录)

答: 最好可以通过权重(layout_weight)的方式来分配每个组件的大小,也可以通过具体的像素(dip)来确定大小。

尽量使用Relativelayout 。

已知应用支持平台设备的分辨率,可以提供多个layout_320*480 ...

drawable-hdpi,drawable-mdpi,drawable-ldpi分别代表分辨率为480*800,360*480,240*360, 放置图片大小相差1.5倍

最后还需要在AndroidManifest.xml里添加下面一段,没有这一段自适应就不能实现:

<supports-screens

android:largeScreens="true"

android:normalScreens="true"

 android:anyDensity = "true"/>

在</application>标签和</manifest> 标签之间添加上面那段代码。即可。

备注:三者的解析度不一样,就像你把电脑的分辨率调低,图片会变大一样,反之分辨率高,图片缩小

还可以通过.9.png实现图片的自适应

7)简述Android中的IPC机制

IPC(Inter-Process Communication,进程间通信),aidl是 Android Interface definition language的缩写,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口.编译器可以通过扩展名为aidl的文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的.

BroadcastReceiver也可以实现进程间通信

ContentProvider 提供进程间数据共享

8)android哪几种方式访问网络

http协议:超文本传输协议

(最底层的是Socket,接着是URLConnection,HttpClient)

HttpURLConnection

HttpClient方式(HttpGet和HttpPost类)

9)说说HttpClient的通信过程

1)生成请求对象(HttpGet get,HttpPost post)

2)生成客户端对象 HttpClient client

3)执行请求接收相应 HttpResponse response = client.execute(post)

HttpEntity entity = response.getEntity()

4)得到数据流

InputStream inputStream = entity.getContent();

5)最后关闭过期连接

10)XML解析有哪几种?各自优缺点,官方推荐使用哪种

基本的解析方式有三种: DOM,SAX,Pull

1)dom解析解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构的优点是对文档增删改查比较方便,缺点占用内存比较大。

2)sax解析基于事件驱动型,优点占用内存少,解析速度快,缺点是只适合做文档的读取,不适合做文档的增删改查。

3)pull解析同样基于事件驱动型,android 官方API提供,可随时终止,调用next() 方法提取它们(主动提取事件)

11)百度地图核心类,及实现的功能

BMapManager:地图引擎管理类,负责初始化,开启地图API,终止百度地图API等工作

MKSearch:搜索服务.用于位置检索、周边检索、范围检索、公交检索、驾乘检索、步行检索

MKSearchListener搜索结果通知接口。该接口返回poi搜索,公交搜索,驾乘路线,步行路线结果

MapView:显示地图的View

MyLocationOverlay:一个负责显示用户当前位置的Overlay。

Overlay:Overlay是一个基类,它表示可以显示在地图上方的覆盖物。

12)GC内存泄露在什么情况下会出现?怎么解决

  1. 查询数据库没有关闭游标
  2. 构造Adapter时,没有使用缓存的 convertView
  3. Bitmap对象不在使用时调用recycle()释放内存
  4. 不用的对象没有及时释放对象的引用

13)android内存的优化

答:android内存泄露容易导致内存溢出,又称为OOM。

Android内存优化策略:

1)在循环内尽量不要使用局部变量

2)不用的对象即时释放,即指向NULL

3)数据库的cursor即时关闭。

4)构造adapter时使用缓存contentview

5)调用registerReceiver()后在对应的生命周期方法中调用unregisterReceiver()

6)即时关闭InputStream/OutputStream。

7)android系统给图片分配的内存只有8M, 图片尽量使用软引用, 较大图片可通过BitmapFactory缩放后再使用,并及时recycle

8)尽量避免static成员变量引用资源耗费过多的实例。

14)加载大图片的时候如何防止内存溢出

答: android系统给图片分配的内存只有8M,当加载大量图片时往往会出现OOM。

Android加载大量图片内存溢出解决方案:

1)尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存,可以通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的 source

2)使用BitmapFactory.Options对图片进行压缩

 InputStream is = this.getResources().openRawResource(R.drawable.pic1);

 BitmapFactory.Options options=new BitmapFactory.Options();

 options.inJustDecodeBounds = false;

 options.inSampleSize = 10; //width,hight设为原来的十分一

 Bitmap btp =BitmapFactory.decodeStream(is,null,options);

3)运用Java软引用,进行图片缓存,将需要经常加载的图片放进缓存里,避免反复加载

及时销毁不再使用的Bitmap对象

 if(!bmp.isRecycle() ){

 bmp.recycle() //回收图片所占的内存

 system.gc() //提醒系统及时回收

 }

15)Android缓存机制

答: 客户端缓存机制是android应用开发中非常重要的一项工作,使用缓存机制不仅仅可以为用户节省3G流量,同时在用户体验方面也是非常好的选择,比如有些新闻客户端支持离线模式,也是通过缓存机制实现的.缓存机制分为两部分,一部分是文字缓存,另一部分是多媒体文件缓存.

文字缓存有两种实现:

1)可以将与服务器交互得到的json数据或者xml数据存入sd卡中,并在数据库添加该数据的记录.添加数据库记录时,提供两个关键字段,一个是请求的URL,另一个则是本地保存后的文件地址,每次加载数据之前都会根据URL在数据库中检索

2)将JSON数据解析后装入List<Map>对象中,然后遍历List,将数据统统写入相应的数据库表结构中,以后每次向服务器发起请求之前可以先在数据库中检索,如果有直接返回.

多媒体文件缓存:主要指图片缓存

图片的缓存可以根据当前日期,时间为名字缓存到SD卡中的指定图片缓存目录,同时数据库中做相应记录,记录办法可以采用两个关键字段控制,一个字段是该图片的URL地址,另一个字段是该图片的本机地址.取图片时根据URL在数据中检索,如果没有则连接服务器下载,下载之后再服务器中作出相应记录

缓存文件删除策略:

1) 每一个模块在每次客户端自动或者用户手动更新的时候删除相应模块的缓存文件,并重新下载新的缓存文件.

2)在设置界面中提供删除缓存的功能,点击后删除本机所有缓存.

16)MVC在Android中的应用

答: Android中界面部分也采用了当前比较流行的MVC框架,在Android中:

1) 视图层(View):一般采用XML文件进行界面的描述,使用的时候可以非常方便的引入。也可以使用JavaScript+HTML等的方式作为View层,通过WebView组件加载,同时可以实现Java和JavaScript之间的通信。

2) 控制层(Controller):这句话也就暗含了不要在Acitivity中写代码,要通过Activity交割Model业务逻辑层处理,这样做的另外一个原因是Android中的Acitivity的响应时间是5s,如果耗时的操作放在这里,Android的控制层的重任通常落在了众多的Acitvity的肩上,程序就很容易被回收掉。

3) 模型层(Model):对数据库的操作、对网络等的操作都应该在Model里面处理,当然对业务计算等操作也是必须放在的该层的。

 在Android SDK中的数据绑定,也都是采用了与MVC框架类似的方法来显示数据。在控制层上将数据按照视图模型的要求(也就是Android SDK中的Adapter)封装就可以直接在视图模型上显示了,从而实现了数据绑定。比如显示Cursor中所有数据的ListActivity,其视图层就是一个ListView,将数据封装为ListAdapter,并传递给ListView,数据就在ListView中显示。

17)Android自定义组件实现思路

答: Android自定义组件有三种实现思路:

  1. 继承某个现有组件,在其基础上添加额外功能,如继承Gallery实现CoverFlow效果
  2. 继承某个Layout,实现复合组件自定义,如TextView和EditText组合实现登录注册组件
  3. 继承View,实现onDraw()方法,实现自己绘制组件,如翻页效果组件

18)版本更新的实现思路

答:在服务器相应URL上有版本文件, 客户端同时存储该应用当前版本号 (SharedPreferences/Sqlite), 每次打开应用,去检测服务器版本号与本地版本号是否一致,如果不一 致,则自定义对话框提示是否下载更新

19)NDK开发流程?(JNI运行原理)

答: NDK应用的开发流程(在应用中定义本地接口(native), 编译成.h头文件,交由C程序员实现,将.c实现通过NDK编译成.so动态链接库,导入项目中libs/armeabi,代码中调用该本地接口)

应用场景: 音频,视频解码,拍摄车牌号,识别车牌号

20)谈谈UI中, Padding和Margin有什么区别,gravity与layout_gravity的区别

答:Padding 用来指定组件内的内容距离组件边界的距离;

 Margin用来指定控件与控件之间的距离

Gravity用来指定组件内的内容相对于组件本身的位置

Layout_gravity用来指定组件相对于其父组件的位置

继续阅读