网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
可读模式
Context.MODE_WORLD_READABLE的值是1;
①创建出来的文件可以被其他应用所读取
可写模式
Context.MODE_WORLD_WRITEABLE的值是2
①允许其他应用对其进行写入。
Q:了解SQLite中的事务处理吗?是如何做的?
使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果程序执行到endTransaction()之前调用了setTransactionSuccessful() 方法设置事务的标志为成功则提交事务,如果没有调用setTransactionSuccessful() 方法则回滚事务。多用于大量数据操作时,能明显减少耗时。
https://blog.csdn.net/a443453087/article/details/7222247
Q:使用SQLite做批量操作有什么好的方法吗?
即使用事务处理进行优化,默认SQLite的数据库插入操作,如果没有采用事务的话,它每次写入提交,就会触发一次事务操作,而这样几千条的数据,就会触发几千个事务的操作,这就是时间耗费的根源
Q:如果现在要删除SQLite中表的一个字段如何做?
SQLite目前还不支持drop column,所以必须想出另外一种方法来进行表字段的删除。
如下sql语句会复制一个和record表一样表结构的temp表出来,但是我们想要的是去除某一个字段(例如去除record表中的name字段,就不要复制它就好了),所以sql语句如下:
create table temp as select recordId, customer, place, time from record where 1 = 1;
这样复制出来的表就会缺少“name”字段,然后我们删除旧表并修改新表名即可。
Q:使用SQLite时会有哪些优化操作?
https://blog.csdn.net/phenixyf/article/details/70597232
View
====
Q:MotionEvent是什么?包含几种事件?什么条件下会产生?
https://blog.csdn.net/vansbelove/article/details/78416791
Q:scrollTo()和scrollBy()的区别?
scrollBy()也调用了scrollTo()方法,实现了基于当前位置的滑动,而scrollTo()是基于所传参数的绝对滑动
Q:Scroller中最重要的两个方法是什么?主要目的是?
1、public void startScroll(int startX, int startY, int dx, int dy, int duration)
函数功能说明:开始一个动画控制,由(startX , startY)在duration时间内前进(dx,dy)个单位(dx正值向左滑,负值向右滑),到达坐标为 (startX+dx , startY+dy)处。
2、
/**
-
在其内部完成平滑滚动的逻辑 。在整个后续的平滑滚动过程中,computeScroll()方法是会一直被调用的,
-
我们需要不断调用Scroller的computeScrollOffset()方法来进行判断滚动操作是否已经完成了
-
如果还没完成的话,那就继续调用scrollTo()方法,并把Scroller的curX和curY坐标传入,然后刷新界面从而完成平滑滚动的操作。
*/
@Override
public void computeScroll() {
if (mScroller.computeScrollOffset()) {
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
invalidate();
}
}
Q:谈一谈View的事件分发机制?
https://blog.csdn.net/mountain_hua/article/details/81545490
Q:如何解决View的滑动冲突?
外部拦截:可以在父布局中将onInterceptTouchEvent的返回值设为true进行拦截
内部拦截:类似反射的方式进行拦截,稍显复杂。需要配合requestDisallowInterceptTouchEvent进行拦截
Q:谈一谈View的工作原理?
https://www.cnblogs.com/cr330326/p/6340973.html
View的工作流程
View的工作流程主要是指measure、layout、draw这三大流程,即测量、布局、绘制,其中measure确定View的测量宽/高,layout确定View的最终宽/高和四个顶点的位置,而draw则将View绘制到屏幕上。
measure过程
measure过程要分情况来看,如果是一个原始的View,那么通过measure方法就完成了其测量过程,如果是一个ViewGroup,除了完成自己的测量过程外,还会遍历去调用所有子元素的measure方法,各个子元素再递归去执行这个流程。
Layout过程
Layout的作用是ViewGroup用来确定子元素的位置,当ViewGroup的位置被确定后,它在onLayout中会遍历所有的子元素并调用其layout方法,在layout方法中onLayout方法又会被调用。
draw过程
draw过程就比较简单了,它的作用是将View绘制到屏幕上面,View的绘制过程循序以下几步:
绘制背景background.draw(canvas)
绘制自己(onDraw)
绘制children(dispatchDraw)
绘制装饰(onDrawScrollBars)
Q:MeasureSpec是什么?有什么作用?
https://www.jianshu.com/p/647913c11673
https://blog.csdn.net/xxdw1992/article/details/81128900
总结
View的measureSpec由其父容器的measureSpec及自身的LayoutParams共同决定
若子View为具体的大小(如100px),则不管其父容器的specMode为哪种,子View对应的specMode均为EXACTLY,specSize均为childSize
若子View的LayoutParams中的宽或高为wrap_content,则不管其父容器的specMode为哪种,子View对应的specMode均为AT_MOST,specSize均为parentLeftSize
子View的前期measure过程实际上在其父容器的onMeasure中就基本完成了,父容器会把计算好的measureSpec传递给子View,子View在自己的onMeasure中可以得到这些值,子View可以根据这些值设置自己的大小,当然也可以不参考它们。最终在onMeasure方法通过调用
setMeasuredDimension方法设置view的最终measureSize。但View的真实大小是在Layout阶段才确定下来的,通过child.layout(left,top,right,bottom).View的measure size与 layout size不必相等,但绝大多数情况下是相等的。
总的来说就是计算出来的父View的MeasureSpec不断往子View传递,结合子View的LayoutParams 一起再算出子View的MeasureSpec,然后继续传给子View,不断计算每个View的MeasureSpec,子View有了MeasureSpec才能更测量自己和自己的子View。
Q:自定义View/ViewGroup需要注意什么?
https://blog.csdn.net/myth13141314/article/details/81449109
自定义View的分类:
继承View重写onDraw方法
主要用于实现不规则的效果,即这种效果不方便通过布局的组合方式来实现。相当于就是得自己“画”了。采用这种方式需要自己支持wrap_content,padding也需要自己处理
继承ViewGroup派生特殊的Layout
主要用于实现自定义的布局,看起来很像几种View组合在一起的时候,可以使用这种方式。这种方式需要合适地处理ViewGroup的测量和布局,并同时处理子元素的测量和布局过程。比如自定义一个自动换行的LinerLayout等。
继承特定的View,比如TextView
这种方法主要是用于扩展某种已有的View,增加一些特定的功能。这种方法比较简单,也不需要自己支持wrap_content和padding。
继承特定的ViewGroup,比如LinearLayout
这种方式也比较常见,和上面的第2种方法比较类似,第2种方法更佳接近View的底层。
自定义View需要注意的地方:
让View支持wrap_content
直接继承View和ViewGroup的控件需要在onMeasure方法中处理wrap_content的方法。处理方法是在wrap_content的情况下设置一个固定的尺寸
让View支持padding
直接继承View的控件需要在onDraw方法中处理padding,否则用户设置padding属性就不会起作用。直接继承ViewGroup的控件需要在onMeasure和onLayout中考虑padding和子元素的margin对其造成的影响,不然将导致padding和子元素的margin失效。
尽量不要在View中使用Handler
View中已经提供了post系列方法,完全可以替代Handler的作用。
View中如果有线程或者动画,需要及时停止
在View的onDetachedFromWindow方法可以停止线程和动画,因为当View被remove或是包含此View的Activity退出时,就会调用View的onDetachedFromWindow方法。如果不处理的话很可能会导致内存泄漏
View带有滑动嵌套时,需要处理好滑动冲突问题
在View的onDraw方法中不要创建太多的临时对象,也就是new出来的对象。因为onDraw方法会被频繁调用,如果有大量的临时对象,就会引起内存抖动,影响View的效果
Q:onTouch()、onTouchEvent()和onClick()关系?
public boolean dispatchTouchEvent(MotionEvent event) {
if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&
mOnTouchListener.onTouch(this, event)) {
return true;
}
return onTouchEvent(event);
}
从源码中可以看出,这两个方法都是在View的dispatchTouchEvent中调用的,onTouch优先于onTouchEvent执行。如果在onTouch方法中通过返回true将事件消费掉,onTouchEvent将不会再执行。
另外需要注意的是,onTouch能够得到执行需要两个前提条件,第一mOnTouchListener的值不能为空,第二当前点击的控件必须是enable的。因此如果你有一个控件是非enable的,那么给它注册onTouch事件将永远得不到执行。对于这一类控件,如果我们想要监听它的touch事件,就必须通过在该控件中重写onTouchEvent方法来实现。
onTouch()中的ACTION_UP执行之后,会执行onClick()方法。onClick()方法在onTouchEvent()里面执行。
Q:SurfaceView和View的区别?
https://www.cnblogs.com/dubo-/p/6638094.html
view在UI线程去更新自己;而SurfaceView则在一个子线程中去更新自己
surfaceView是在一个新起的单独线程中可以重新绘制画面,而View必须在UI的主线程中更新画面
最后
代码真的是重质不重量,质量高的代码,是当前代码界提倡的,当然写出高质量的代码肯定需要一个相当高的专业素养,这需要在日常的代码书写中逐渐去吸收掌握,谁不是每天都在学习呀,目的还不是为了一个,为实现某个功能写出高质量的代码。
所以,长征路还长,大家还是好好地做个务实的程序员吧。
最后,小编这里有一系列Android提升学习资料,有兴趣的小伙伴们可以来看下哦~
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
养,这需要在日常的代码书写中逐渐去吸收掌握,谁不是每天都在学习呀,目的还不是为了一个,为实现某个功能写出高质量的代码。**
所以,长征路还长,大家还是好好地做个务实的程序员吧。
最后,小编这里有一系列Android提升学习资料,有兴趣的小伙伴们可以来看下哦~
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!