-
surfaceView和view的区别
- 最显著的区别就是普通view和它的宿主窗口共享一个绘图表面(Surface),SurfaceView虽然也在View的树形结构中,但是它有属于自己的绘图表面,Surface 内部持有一个Canvas,可以利用这个Canvas绘制。
- SurfaceView提供一个直接的绘图表面(Surface)嵌入到视图结构层次中。你可以控制这个Surface的格式,大小,SurfaceView负责在屏幕上正确的摆放Surface。简单说就是SurfaceView拥有自己的Surface,它与宿主窗口是分离的。
- View适用主动更新,SurfaceView 适用被动更新,如频繁的刷新View在UI线程更新,在非UI线程更新会报错,当在主线程更新view时如果耗时过长也会出错, SurfaceView在子线程刷新不会阻塞主线程,适用于界面频繁更新、对帧率要求较高的情况。SurfaceView可以控制刷新频率。SurfaceView底层利用双缓存机制,绘图时不会出现闪烁问题
- 双缓冲技术是游戏开发中的一个重要的技术,主要是为了解决 反复局部刷屏带来的闪烁。游戏,视频等画面变化较频繁,前面还没有显示完,程序又请求重新绘制,这样屏幕就会不停地闪烁。双缓冲技术会把要处理的图片在内存中处理好之后,把要画的东西先画到一个内存区域里,然后整体的一次性画出来,将其显示在屏幕上。
-
集合哪些是安全的
- Vector、HashTable、Properties是线程安全的;
- ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等都是线程不安全的。
-
RecyclerView与ListView对比
1. 缓存机制不同
1.recyclerView比ListView多两层缓存
1. recyclerView 四级缓存
2. listView 两级缓存
1. 局部刷新- 缓存机制不同
1.recyclerView比ListView多两层缓存- recyclerView 四级缓存
- listView 两级缓存
- 缓存机制不同
1. 局部刷新 (指定ViewHolder完成rebind数据)
1. 通过notifyDataSetChanged 刷新
+ 调用该方法后会将所有的holder添加一个ADAPTER_POSITION_UNKNOWN的flag的标识其position未知 并将boolean变量 mDataSetHasChangedAfterLayout置为true
2. notifyItemInserted 添加item
+ 上面说过,在dispatchLayoutStep1时会根据操作集合(增删改)mPendingUpdates来执行相应的offsetPosition操作,就是将因为此操作而将要改变位置的holder的position全部更新比如在2的位置insert了一个item,那么offsetPosition后,当前所有从2开始的holder的position全部后移1,包括cached里的holder 那么在dispatchLayoutStep2复用position为2的holder时就没有,只能从pool里取或者新建holder,那么holder肯定标志位是重置的,需要rebind数据。
3. notifyItemUpdate更新某个item
-
java有什么特性,继承有什么用处,多态有什么用处
- 继承,子类继承父类bai中所以du的属性和方法,但是对于private的属zhi相和方法,由于这个是父类的dao隐私,所以子类虽然是继承了,但是没有可以访问这些属性和方法的引用,所以相当于没有继承到。很多时候,可以理解为,没有继承。
- 多态:就是父类引用可以持有子类对象。这时候只能调用父类中的方法,而子类中特有方法是无法访问的,因为这个时候(编译时)你把他看作父类对象的原因,但是到了运行的时候,编译器就会发现这个父类引用中原来是一个子类的对像,所以如果父类和子类中有相同的方法时,调用的会是子类中的方法,而不是父类的。
可以这么说:编译时看父类,运行时看子类。
-
反射是什么,在哪里用到,怎么利用反射创建一个对象
- 要是指程序可以访问、检测和修改它本身状态或行为的一种能力
- 一般是在读取配置文件的时候使用,比如在配置文件中定义了类名和方法名,要通过反射机制来找到对应的类和方法。
- 方法1:通过类对象调用newInstance()方法,例如:String.class.newInstance()
- 方法2:通过类对象的getConstructor()或getDeclaredConstructor()方法获得构造器(Constructor)对象并调用其newInstance()方法创建对象,例如:String.class.getConstructor(String.class).newInstance("Hello");