Android开发面试经——6.常见面试官提问Android题②(更新中...)

 

关注finddreams博客:http://blog.csdn.net/finddreams/article/details/44560061 
1.HttpURLConnection和HttpClient他们各自的优缺点是什么? 
HttpUrlConnection 在 2.3 之前的版本是有 bug 的,因此以前的版本推荐使用 HttpClient,可是 google 如今已经不维护 HttpClient 了,5.1里面已经把 HttpClient 标过时。另外 HttpURLConnection 支持gzip压缩等,推荐首选它。 
在 Froyo(2.2) 以前,HttpURLConnection 有个重大 Bug,调用 close() 函数会影响链接池,致使链接复用失效,因此在 Froyo 以前使用 HttpURLConnection 须要关闭 keepAlive。 
另外在 Gingerbread(2.3) HttpURLConnection 默认开启了 gzip 压缩,提升了 HTTPS 的性能,Ice Cream Sandwich(4.0) HttpURLConnection 支持了请求结果缓存。 
再加上 HttpURLConnection 自己 API 相对简单,因此对 Android 来讲,在 2.3 以后建议使用 HttpURLConnection,以前建议使用 AndroidHttpClient。android

2.Android开发中XML解析方式的比较 ,及优缺点? 
DOM,SAX,Pull解析。 
SAX解析器的优势是解析速度快,占用内存少;面试

DOM在内存中以树形结构存放,所以检索和更新效率会更高。可是对于特别大的文档,解析和加载整个文档将会很耗资源,不适合移动端;设计模式

PULL解析器的运行方式和SAX相似,都是基于事件的模式,PULL解析器小巧轻便,解析速度快,简单易用,很是适合在Android移动设备中使用,Android系统内部在解析各类XML时也是用PULL解析器。缓存

3.请问平时开发过程当中,你是如何作到多分辨率适配的? 
1.根据不一样分辨率创建不一样的布局文件 
2.根据分辨率不一样创建不一样分辨率的资源图片 
3.在程序启动时,获取当前屏幕的分辨率和密度,在代码中进行适配 
4.为不一样分辨率的写不一样的dimen文件。 
5.其实还有就是多使用fragement微信

4. 谈谈你在工做中是怎样解决一个bug的? 
1.看Log日志 
2.Log解决不了就断点调试 
3.若是debug不行 
4.就在异常代码的附近Log.e(“error”,”1”);,2,3,4,5,6,7,8,9 每隔一行一个Log输出,看结果 
5.找到问题,自行找思路。若是是技术瓶颈,就google之markdown

5.声明ViewHolder内部类时,为何建议使用static关键字? 
其实这个是考静态内部类和非静态内部类的主要区别之一。非静态内部类会隐式持有外部类的引用,就像你们常常将自定义的adapter在Activity类里,而后在adapter类里面是能够随意调用外部activity的方法的。当你将内部类定义为static时,你就调用不了外部类的实例方法了,由于这时候静态内部类是不持有外部类的引用的。声明ViewHolder静态内部类,能够将ViewHolder和外部类解引用。你们会说通常ViewHolder都很简单,不定义为static也没事吧。确实如此,可是若是你将它定义为static的,说明你懂这些含义。万一有一天你在这个ViewHolder加入一些复杂逻辑,作了一些耗时工做,那么若是ViewHolder是非静态内部类的话,就很容易出现内存泄露。若是是静态的话,你就不能直接引用外部类,迫使你关注如何避免相互引用。 因此将 ViewHolder内部类 定义为静态的,是一种好习惯. 
非静态内部类隐式持有外部类的强引用,只是可能会致使内存泄露,而通常状况下在使用viewhodler是不会致使内存泄露的,加static是一个比较好的习惯网络

6.如何在不失真的条件下显示一张超高清的图片或者长图? 
一、经过计算BitmapFactory.Options 对象的inSamleSize 值 等比的压缩图片 。 
二、使用WebView来加载该图片; 
三、使用MapView或者TileView来显示图片(相似地图的机制);微信开发

7. Android中有哪些方法实现定时和延时任务?它们的适用场景是什么? 
倒计时类 
用CountDownTimer框架

延迟类 
CountDownTimer,可巧妙的将countDownInterval设成和millisInFuture同样,这样就只会调用一次onTick和一次onFinish 
handler.sendMessageDelayed,可参考CountDownTimer的内部实现,简化一下,我的比较推荐这个 
TimerTask,代码写起来比较乱 
Thread.sleep,感受这种不太好 
使用Handler方法postDelay(runnable, delayTime)

定时类 
参照延迟类的,本身计算好要延迟多少时间 
handler.sendMessageAtTime 
AlarmManager,适用于定时比较长远的时间,例如闹铃

8.谈谈你对StrongReference、WeakReference和SoftReference的认识 
强引用(StrongReference):就是在代码中广泛存在的,相似Object obj = new Object()这类的引用,只要强引用还存在,GC永远不会回收掉被引用的对象。 
软引用(SoftReference):用来描述一些还有用但非必须的对象。对于软引用关联着的对象,在系统将要发生内存溢出异常时,将会把这些对象列入回收范围之中进行第二次回收。若是此次回收尚未足够的内存,才会抛出内存溢出异常。在JDK 1.2以后,提供了SoftReference类来实习软引用。

弱引用(WeakReference):也是用来描述非必须对象的,可是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到了下一次GC发生以前。当GC工做时,不管当时内存是否足够,都会回收只被弱引用关联的对象。在JDK 1.2以后,提供了WeakReference类来实现弱引用。

虚引用(PhantomReference):这个引用po主没有提到,不过也能够顺带了解一下。虚引用也称幽灵引用或者幻影引用,它是最弱的一种引用关系。一个对象是否有虚引用的存在,彻底不会对其生存时间构成影响,也没法经过虚引用来取得一个对象实例。为一个对象设置虚引用的惟一目的就是在这个对象被GC回收是收到一个系统通知。在JDK 1.2以后提供了PhantomReference类来实现虚引用。

9.你应用中的网络层是怎么设计的? 
1. android-async-http. 
封装了下经常使用的方法,get post 上传 下载 ,全部的请求我都是用的同步请求. 
具体的用法通常都是和业务逻辑在一块儿,而个人业务逻辑是用异步去处理的. 
关于网络请求结果的缓存,我是单独处理的.并无放在网络层.

2.在HttpUrlConnection基础上封装, 包括请求成功, 失败, 请求中, 网络问题等封装, 利用广播与UI交互 
3.直接使用xUtils,afinal,okHttp,Volley等开源第三方框架;

Bitmap是android中常用的一个类,它表明了一个图片资源。 
Bitmap消耗内存很严重,若是不注意优化代码,常常会出现OOM问题,优化方式一般有这么几种: 
1. 使用缓存; 
2. 压缩图片; 
3. 及时回收;

10.谈谈你对Bitmap的理解, 何时应该手动调用bitmap.recycle()? 
至于何时须要手动调用recycle,这就看具体场景了,原则是当咱们再也不使用Bitmao时,须要回收之。另外,咱们须要注意,2.3以前Bitmap对象与像素数据是分开存放的,Bitmap对象存在Java Heap中而像素数据存放在Native Memory中,这时颇有必要调用recycle回收内存。可是2.3以后,Bitmap对象和像素数据都是存在Heap中,GC能够回收其内存。

11.ViewPager中加载Fragment的优化问题?如何作到微信那样切换界面时的延时加载? 
利用fragment中的setUserVisibleHint这个方法能够来作到.

private boolean hasLoadedOnce = false; // your boolean field @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (this.isVisible()) { // we check that the fragment is becoming visible if (isVisibleToUser && !hasLoadedOnce) { //do something } } } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

12什么是aar?aar和jar有什么区别? 
“aar”包是 Android 的类库项目的二进制发行包。

文件扩展名是.aar,maven 项目类型应该也是aar,但文件自己是带有如下各项的 zip 文件:

/AndroidManifest.xml (mandatory) 
/classes.jar (mandatory) 
/res/ (mandatory) 
/R.txt (mandatory) 
/assets/ (optional) 
/libs/*.jar (optional) 
/jni//*.so (optional) 
/proguard.txt (optional) 
/lint.jar (optional) 
这些条目是直接位于 zip 文件根目录的。 
其中R.txt 文件是aapt带参数–output-text-symbols的输出结果。

jar打包不能包含资源文件,好比一些drawable文件、xml资源文件之类的,aar能够。

13.如何加密Url防止被黑? 
加密到JNI里面仍是会经过抓包工具抓取到.最后的方式就是进行HTTPS证书双向加密验证

14.Android fragment和activity的区别 
你能够理解Fragment是一种特殊的View,负责一个模块或者一个特殊部分的展现。 
大部分Fragment是依托于Activity存在的,由Activity的FragmentManager来管理 
Fragment能够解决多Activity的问题,即将3.0以前的频繁Activity跳转改为一个Activity内Fragment的切换。 
Fragment能够解决碎片化的问题。 
fragment是android3.0新增的 
fragment能够重用 
fragment必须嵌套在activity中使用,它的生命周期受activity的影响。

15.Service和广播 BroadcastReceivre会不会出现ANR? 
Service,广播 会出现ANR 
服务, 广播都是主线程中, 既然是主线程 固然会anr 因此耗时操做仍是必须另起线程 
通俗的说超时时间:Activity 5秒, Broadcast 10秒, Server 20秒

16.你在平时开发中会使用到哪些设计模式,能谈谈这些设计模式的使用场景吗? 
平时用的比较多有单例模式(在内存中仅实例化一个对象时使用),适配器模式(典型的就是ListView和GridView的适配器),建造者模式(AlertDialog.Builder),观察者模式可能比较隐蔽,在Android源码中BaseAdapater的NotifyDataSetChanged的实现(?) 
单例:DownloadManager

 
8
0
相关文章
相关标签/搜索