1,ListView中图片错位的问题是如何产生的?
2,混合开发有了解吗?
3,知道哪些混合开发的方式?说出它们的优缺点和各自使用场景?(解答:比如RN,weex,H5,小程序,WPA等。做android的了解一些前端js等还是很有好处的);
4,屏幕适配的处理技巧都有哪些?
5,服务器只提供数据接收接口,在多线程或多进程条件下,如何保证数据的有序到达?
6,动态布局的理解
7,怎么去除重复代码?
答:
从代码上去除重复的代码就是用通用的重构技巧,比如提炼方法,抽象基类,提炼常量等。但是光是代码还不够,因为Android的页面代码跟布局文件的关联非常大,通常Activity或者Fragment都是为了操作布局页写的,所以要想彻底的减少代码的重复,还必须先减少布局的重复。
标签是减少布局重复的利器,它的作用是把另外一个布局文件全部无修改式的嵌入到标签所在的位置。这与C/C++语言的预处理指令#include是一样的。在WEB框架式开发中,也非常常用HTML模板,其中也有类似的include。目的也是减少代码的重复。
要想把include用的恰到好处,首先要做的就是把整体布局模块化,从整体的布局出发,找出可复用的局部布局或布局组合,把它们放入单独一个布局文件中,然后在其他的地方就可以include了。
前面是找出布局中的可复用布局组合,include以减少重复。但有些时候是反过来的,也就是说有几个页面,它们整体的一样的,但是某个局部是不同的,这个时候include就不行了。这个时候就可以使用一样的整体布局+ViewStub来做布局。
ViewStub是一个轻量级别的,不可见的View,当ViewStub被设为visible时,或者显示调用layout()时,才会去把它所指向的布局渲染出来,所以它非常适合处理整体相同,局部不同的情况。关于ViewStub的使用可以参考这篇博客。 具体的策略是:
这点是非常重要的,Android的强大之处在于,所有的资源的指定都可以用引用,而非直接写死,直接写死就会出现重复代码,比如颜色,背影,字串,布局,ID,度量(dimen),风格等等。那么,我们在使用的时候,也尽可能的使用引用,这样非常易于复用,修改和定制,从而也就更方便复用。
其实代码的去重复的关键都在于要分析出可变与不可变,共性和特性,这是抽象与封装的基础。这个没有直接可操作性的建议,只能靠自己平时多多积累,以及遇到问题时多多思考。
另外,就是对于重复的定义是达到三次及三次以上。如果仅出现二次,并且,无可能出现别一次,这个时候其时,要不要去重复有在商榷,写第二次时,花时间重构,与拷贝或重新实现,其实代码差不多。当发现第三次实现某个东西时,就要考虑好好的重构一下,减少重复。
还有,就是,在项目开始不要考虑的太多,不要过度设计。孤认为,不过过度设计,更不要过早优化,就根据需求和进度和发展状况综合来看。当出现了重复,需要重构时就立马去做,这样就不会出问题。但如果没能及时去做重构,欠了债,那么由于涉及代码,功能和模块都比较多时,再去重构,难度大,风险也大。就好比房屋的维护保养,当出现灰尘时就去打扫,很容易,个把小时就搞定了,但如果一直拖着,一年才打扫一次,可能要十天半个月才能完事。
8,画出android的大体框架图
9,RecycleView和ListView的区别
答:
一、两者的缓存机制上的区别
先来说一样的地方,ListView与RecyclerView缓存机制原理大致一样,滑动的时候,离开屏幕的ItemView被回收到缓存,新的itemView加在优先获取的缓存中的,这是正常的两种类似的缓存机制。
而不同的地方在于,两者的缓存层级不同,ListView只有两层,RecycleView有四级缓存。
1. mActiveViews和mAttachedScrap功能相似,意义在于快速重用屏幕上可见的列表项ItemView,而不需要重新createView和bindView;
2. mScrapView和mCachedViews + mReyclerViewPool功能相似,意义在于缓存离开屏幕的ItemView,目的是让即将进入屏幕的ItemView重用;
3. RecyclerView的优势在于: a.mCacheViews的使用,可以做到屏幕外的列表项ItemView进入屏幕内时也无须bindView快速重用; b.mRecyclerPool可以供多个RecyclerView共同使用,在特定场景下,如viewpaper+多个列表页下有优势.客观来说,RecyclerView在特定场景下对ListView的缓存机制做了补强和完善。
同时,两者的缓存不同,RecycleView缓存在ViewHolder,可以看作是:View + ViewHolder(避免每次createView时调用findViewById) + flag(标识状态);而ListView缓存在View上,获取缓存的方法流程是:
listView的mScrapViews是根据pos获取相应的缓存,但不直接用,是重新getView(这样会重新bindView)。所以ListView中通过pos获取的是View。
RecycleView的流程是:
mRecycleView在获取缓存的时候,是通过匹配pos获得目标的位置的缓存,这么做可以不用重新bindView,所以RecycleVIew中通过pos获取的是viewholder,是pos-->(view,holder,flag),flag是判断view是否需要重新bindView。
二、局部刷新的区别
RecycleView中的notifyItemRemoved(position)方法,最终会调用requestLayout()方法,使整个View重新绘制,为:onMeasure()-->onLayout()-->onDraw()
其中的onLayout分三步:
1.dispathLayoutStep1():记录RecyclerView刷新前列表项ItemView的各种信息,如Top,Left,Bottom,Right,用于动画的相关计算;
2.dispathLayoutStep2():真正测量布局大小,位置,核心函数为layoutChildren();
3.dispathLayoutStep3():计算布局前后各个ItemView的状态,如Remove,Add,Move,Update等,如有必要执行相应的动画.
其中layoutChildren()方法的流程图:
当调用notifyItemRemoved时,会对屏幕内ItemView做预处理,修改ItemView相应的pos以及flag。当调用fill()中RecyclerView.getViewForPosition(pos)时,RecyclerView通过对pos和flag的预处理,使得bindview只调用一次。
需要指出,ListView和RecyclerView最大的区别在于数据源改变时的缓存的处理逻辑,ListView是"一锅端",将所有的mActiveViews都移入了二级缓存mScrapViews,而RecyclerView则是更加灵活地对每个View修改标志位,区分是否重新bindView。
10,ListView图片加载错乱的原理和解决方案
11,动态权限适配方案,权限组的概念
12,android系统为什么设计ContentProvider?
13,下拉状态栏会不会影响activity的生命周期
答:Android下拉通知栏不会影响Activity的生命周期方法
14,如果在onStop的时候做了网络请求,onResume的时候怎么恢复?
答:onResume是在启动activity启动之后才能执行的,也就是恢复执行。程序正常启动:onCreate()->onStart()->onResume();
正常退出:onPause()->onStop()->onDestory()
一个Activity启动另一个Activity: onPause()->onStop(), 再返回:onRestart()->onStart()->onResume()
程序按back 退出: onPause()->onStop()->onDestory(),再进入:onCreate()->onStart()->onResume();
程序按home 退出: onPause()->onStop(),再进入:onRestart()->onStart()->onResume();
15,Bitmap使用时候注意什么?
答:
一、 问题的背景和意义 在Android移动应用开发中,对Bitmap的不小心处理,很容易引起程序内存空间耗尽而导致的程序崩溃问题。比如我们常遇到的问题: java.lang.OutofMemoryError: bitmap size exceeds VM budget. 导致该问题的出现,一般由以下几方面原因导致:引动设备一般存储空间非常有限。当然不同设备分配给应用的内存空间是不同的。但相对不但提高的设备分辨率而言,内存的分配仍然是相对紧张的。
|
16,Bitmap的recycler()
答:Bitmap.recycle();会释放位图所关联的像素资源,并且释放是单向的,一旦释放不可再用。
17,Android中开启摄像头的主要步骤
18,ViewPager使用细节,如何设置成每次只初始化当前的Fragment,其他的不初始化?
答:在onPageSelect中初始化当前的Fragment
19,点击事件被拦截,但是想传到下面的View,如何操作?
20,微信主要页面的实现方式
答:主要用ViewPager+Fragment实现
21,微信上消息小红点的原理
答:主要使用观察者模式 类似事件,比如你做一个信息操作类,这个类是增删改查 , 建立一个委托,这个委托类似
onDataInserted(); onDataUpdated;onDataDeleted, 然后你建立一个观察者类,这个类建立一个跟这个委托格式一致的方法,ATTACH给信息操作类,那当信息操作类做任何增删改的动作你都能侦听到
22,CAS介绍(这是阿里巴巴的面试题,我不是很了解,可以参考博客:CAS简介http://blog.csdn.net/jly4758/article/details/46673835)