【实习日记】未整理,有空再整理
2017-08-01 08:37
246 查看
问题:
关于ChatDemo导入的问题。
关于对话列表Item的点击事件。
7.19
总结:在项目中导入了百度地图SDK。
在环信的项目中集成百度地图 应当将.so文件和.jar包都放在你依赖的easyUI的Module中。这样就能比较快的集成。
在签名生成APK时 easeUI中 资源使用不规范 使用了其他种类的资源。
lintOptions {
disable "ResourceType"
}
easeUI 中 各版本的string.xml中字段不完全对应。
解决:把俄罗斯语的文件删除
把其他不对应的字段 在缺失的地方补齐。
方法:不去做国际化适配,或者一个个适配对应好。
查看签名证书
指令
C:\Program Files\Java\jdk1.8.0_131\bin>keytool -list -keystore E:\Android\Sign\base.jks
需要输入 签名的密码
在微信开发平台中申请了应用,但是还未审批通过。
问题:应用安装后无法获取百度地图的位置信息。
后来发现是手机没有给相应的权限。打开相应的权限即可。
但是为什么安装应用时并没有权限提示?
百度地图和环信的冲突问题。可以查看今天博客中收藏的两篇文章。但是今天并不是按照他们的方法解决的。而是将百度地图的jar包和so文件都放入 easeUI中。就能够很好地解决了。
7.20
7.21
Activity接收到点击事件ACTION_DOWN后 会调用dispatchTouchEvent方法将它直接分发给Window的同名方法中去,如果返回false
则调用Activity自己的onTouchEvent处理。
Window是一个抽象类 其具体的实现类是PhoneWindow 在其dispatchTouchEvent方法中会将点击事件交给DecorView处理。DecorView就是根视图,其继承自FrameLayout
就是一个ViewGroup。
点击事件 如果不拦截
会先一直传递到控件树的最低端view
如果该view或viewGroup不处理会向上传递。
在每一层中,顺序为:onTouch()->onTouchEvent()->onClick()->向上传递;
(实际上setOnTouchListener()设置的是onTouch());
viewGroup中
一旦
拦截了DOWN那么这一个事件序列就会默认交给他处理。不再调用onInterceptTouchEvent()方法。但是 对于DOWN事件
依旧会调用。(注意FLAG_DISALLOW_INTERCEPT标志位)
viewGroup向子元素分发事件时 子元素要能接收到事件(在播动画,大小包括了点击事件的坐标)
View中
不可用状态的View依然可能会消耗点击事件(button.setEnabled(false),取决于他的相关方法的返回值)
如果view设置有代理,那么会执行代理的onTouchEvent方法。
View中有两个标志位CLICKABLE和LONG_CLICKABLE。只要有一个为true,就会消耗点击事件。LONG_CLICKABLE默认都为false,除非为他设置了长按事件或者手动设置了该标志位。CLICKABLE则不同控件不一样(Button为true,Text为false)
onTouch和onTouchEvent 就是针对每一个ACTION都会运行一次。而onClick 针对的是DOWN和UP组成的事件组才构成click事件。只运行一次。
如果只希望运行一次 可以在其中对ACTION做判断。
7.22
问题:Fragment嵌套Fragment中 内层Fragment 在外层Fragment切换过之后 不显示内容。
解决方法。在内层Fragment中使用getChildFragmentManager()来获得FragmentManager对象(代替了getWindow().getFragmentManager())
原因:。。。。就是要用这个。
View的measure过程
Measure会调用OnMeasure方法。
onMeasure方法调用setMeaSuredDimension()方法来设置View的宽高。
而宽高则通过调用
getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec)
这个方法中通过MeasureSpec中的测量模式不同返回不同的值。
case MeasureSpec.AT_MOST:
case MeasureSpec.EXACTLY:
这两种模式下
都返回onMeasure方法传入的值。也就是measure测量后的值(但不是最终值,最终值要在Layout中确定。但是一般最终值和测量值是一致的,这取决于LayouParms。)
MeasureSpec.UNSPECIFIED(一般用于系统内部的测量)
从源码中可以看出来,在这种模式下 getDefaultSize返回的值取决于传入的第一个参数Size。而这个参数是在OnMeasure中由getSuggestMinimumWidth()和getSuggestMinimumHeight()决定的。
这里两个方法是类似的:
如果没有背景 则返回mMinWidth(取决于android:minWidth属性,默认为0)
如果有背景 则返回mMinWidth和背景宽度的最大值。(背景宽度就是Drawable的原始值,ShapDrawable无原始宽高,而BitmapDrawable有原始宽高)
总结:OnMeasure方法中。
测量模式
为UNSPECIFIED时
返回Android:minWidth的值(默认0) 或者设了背景时比minWidth大的背景的宽。
其他模式下:返回measure中测量出的测量值。
疑惑点:ViewGroup中没有Measure方法 也没有OnMeasure方法。且View中的measure方法为final不能被重写。那么是谁调用了。ViewGroup当中的measureChildren等方法。
解答:ViewGroup是一个抽象类。继承他时应该重写onMeasure方法(位于view中)。在这里面调用这些测量方法。(参考FrameLayout)
7.24
View view= LayoutInflater.from(context).inflate(R.layout.collection_item,parent,false);
MyHolder holder=new MyHolder(view);
return holder;
final
CollectionBean bean=data.get(position);
MyHolder myHolder= (MyHolder) holder;
myHolder.movieTitle.setText(bean.getTitle());
myHolder.collectionTime.setText(bean.getData());
Picasso.with(context).load(bean.getURL()).into(myHolder.movieImage);
myHolder.movieLayout.setOnClickListener(new
View.OnClickListener() {
@Override
public void
onClick(View v) {
Intent intent=new Intent(context, MovieInfoActivity.class);
intent.putExtra("id",bean.getId());
context.startActivity(intent);
}
});
7.25
http://blog.csdn.net/qq_35166847/article/details/51814409
Picasso和Glide的优缺点。
内存开销:Picasso大于Glide。
图片质量:picasso好于Glide。(但是很微弱)
加载速度:Glide比较快。
库的大小,和方法数:Glide大于Picasso
GIF:仅Glide支持。
原因:Picasso总是缓存全尺寸大小的图片,而Glide选择缓存和ImageView大小一致的尺寸。但是这种策略导致,Glide每次都要重新下载一次尺寸不一样的图片,网络开销大。但是Glide的显示速度也比较快。因为picasso每次都要重新调整全尺寸图片的大小。
(策略都可以改变。)
同时因为Glide和Activity/Fragment的生命周期是一致的,因此gif的动画也会自动的随着Activity/Fragment的状态暂停、重放。Glide
的缓存在gif这里也是一样,调整大小然后缓存。
问题:签名打包时遇到问题。(Fragment中Google建议使用某种构造方式。)
Error:Error: Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead [ValidFragment]
解决:在类之前添加如下代码 @SuppressLint("ValidFragment") 注意不用吧ValidFragment改成你的类名。
出错解析:参考http://blog.csdn.net/anobodykey/article/details/22503413。
但是这一篇解决的方法比较复杂,按Google官方推荐的方式写。要改的地方太多了。于是我决定 还是直接忽略了。
7.26
RecycleView的吸顶实现
实现思路:
1、在外界布局中
顶上包含(include)一个吸顶布局。在RecycleView的每一个Item布局中包含(include)同一个吸顶布局。在bindingViewHolder中判断每一个Item是不是和前一个Item相同(属于同一个组),以此显示或不显示。再在外界给RecycleView设置一个addOnScrollListener。判断外界布局中吸顶布局的显示和移动。
(缺点:耦合度太高。)
2、重写一个RecyclerView.ItemDecoration 判断与前一个item是否相同来确定是否绘制吸顶布局(实际就是分割线)。
View的measure之MeasureSpec的创建使用。
1、对于DecorView,其MeasureSpec由窗口尺寸和自身的LayoutParams(布局属性:就是match-parent那些)。
在ViewRootImpl中measureHierarchy这一方法为DecorView创建了MeasureSpec。
很明显:ViewRootImpl根据windowSize和rootDimension(其实就是窗口的布局属性)创建了不同的MeasureSpec。具体规则如下:
ViewGroup.LayoutParams.MATCH_PARENT: 精准模式 EXACTLY 大小就是窗口大小
ViewGroup.LayoutParams.WRAP_CONTENT: 最大模式 AT_MOST
大小不定,但是不能超过指定窗口大小。
固定大小(100dp):精准模式
EXACTLY 大小为rootDimension(设置的大小100dp)指定的大小。
2、对于普通View,其MeasureSpec由父容器的MeasureSpec和自身的LayoutParams来决定。
首先普通View的measure过程是由ViewGroup传递过来的,由ViewGroup中的OnMeasure来调用ViewGroup中的几个用于测量的方法。比如:measureChildWithMargins:
很明显在measureChildWithMargins方法中首先获得了。子View的LayoutParams。然后通过将传入的parentWithMeasure和经过处理的子View的属性传入getChildMeasureSpec方法。来获得子元素的MeasureSpec。
而getChildMeasureSpec方法参数:
int spec :父控件的MeasureSpec
Int padding: 父容器中已占的空间大小
Int childDimension:子View想要获得的大小
在获取到参数之后,有确定了几个属性。最后
Swich(specMode){
Case MeasureSpec.EXACTLY:
If(childDimension>=0){
}elseif(...)
}
结果可以用一张表来表示:
(注:返回结果就是将中间的两个值放入resultSize和resultMode中,而childSize指childDimension,parentSize指size就是父容器剩余的空间)
return MeasureSpec.makeMeasureSpec(resultSize, resultMode);
最后返回一个MeasureSpec(int类型的32位数)
View的Measure过程之ViewGroup的Measure过程
之前有提到过由于View当中的measure方法是final类型的,无法在ViewGroup中重写。所以ViewGroup中不提供measure方法。而选择在OnMeasure方法(自己继承ViewGroup这个抽象类时重写)调用ViewGroup提供的几种方法。
MeasureChildren方法:
就是遍历所有子View调用measureChild方法测量
MeasureChild方法:
类似于之前讲解过的measureChildWithMargins方法。这里就不再次讲了。
measureChildWithMargins方法:
疑问:measureChild和measureChildWithMargins方法有何区别?
就是多了两个参数(widthUsed和HeightUsed),并把他们放入了父容器已占有的空间。
7.27
三次握手与四次挥手:
SYN:联机标志位 当其为1时表示这是用来三次握手的数据。
ACK:确认标志位 当其为1时表示这是用来确认的数据。(貌似除了第一次数据之外 之后的都为1)
FIN:结束标志位 当其不为0时表示这书请求结束的一次数据。(貌似其大小代表了这次结束请求的编号)
seq:发送序号 一般为上一次收到的数据中的ack(确认序号),第一个发送序号由双方随机产生。(注意两边的发送序号是不一样的)
ack:确认序号 为上一次接受到的发送序号加一(seq+1)
状态:
SYN_SENT:客户端发送请求连接后等待服务器应答状态。
SYN_RCVD:服务端收到客户端请求连接后等待客户端回复状态。
ESTABLISHED:三次握手完成正常通信状态。
FIN_WAIT_1,FIN_WAIT_2:客户端发送结束请求后进入1,收到服务端回复进入2。
LAST_ACK:服务器发送结束请求后等待客户端应答。
TIME_WAIT:客户端收到服务器的结束请求后进入。(TIME_WAIT状态等待2倍MSL,用于确保本次连接的所有数据都消失在网络中。)
CLOSED:服务端收到客户端的结束应答,后进入关闭状态。而客户端等待两倍MSL进入
(1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack
(number )=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
(3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。
(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
网络分层与网络协议:
普通分为四层:应用层,传输层,网络层,链路层。
应用层协议
7.31
除了调用 startAnimation() ,另一种处理方式是通过Animation.setStartTime()方法定义一个开始时间,然后通过View.setAnimation()方法把这个动画赋给控件即可。
如果你设置了animation的启动时间(setStartTime)但是却调用startAnimation
这个启动时间是没有用的:
明显将开始时间设为了一个固定值。然后调用setAnimation()
动画两个重要部分:
插值器(TimeInterpolator):计算时间流逝和值变化的比例(返回值0到1之间)
估值器(IntEvaluator):计算变化后的实际值。
(上面两个都是例子 还有别的类型的插值器和估值器)
八大排序算法:
直接插入:就是一个个往之前的数组里面插入。
希尔排序:选择一个增量(k),然后把在k+i,2k+i,3K+i....这组数中插入排序(然后把i递增,直至所有数都在某一组)。然后缩小增量,直至k=1;
直接选择:把所有数选出最小的放在第一个,选出第二小的放在第二个.......直至选完(改良版,可以一次选一个最大,选一个最小。)
堆排序 :把所有的数,构成一个堆(实际上是数组,父节点为i,那么子节点是2i+1,2i+2),父节点大于两个子节点(大顶堆)。
去掉顶点然后将最后一个数变为顶点。(渗透函数)
冒泡排序:
快速排序:选定一个标准值k(一般为第一个或最后一个),与low和high指针不断比较(一开始low和high在第一个和最后一个)然后每当其中一个和k的大小有问题时,交换low和high(没问题就每次移动一次指针,直至指针对比有问题。或者low=high)。以此找到标准值在数组中准确位置(k的左边都小于k,右边都大于k)
。然后对左右数组重复这个过程。就可以排序完成了。
归并排序:
基数排序:多应用于多关键字类型的排序(但不是只)。(参考给扑克整理顺序的方式,先按花色分好。然后花色内部大小排序。然后将花色组按顺序排。)空间开销大,且只适用于预先知道大小和类型的数据。
关于ChatDemo导入的问题。
关于对话列表Item的点击事件。
7.19
总结:在项目中导入了百度地图SDK。
在环信的项目中集成百度地图 应当将.so文件和.jar包都放在你依赖的easyUI的Module中。这样就能比较快的集成。
在签名生成APK时 easeUI中 资源使用不规范 使用了其他种类的资源。
lintOptions {
disable "ResourceType"
}
easeUI 中 各版本的string.xml中字段不完全对应。
解决:把俄罗斯语的文件删除
把其他不对应的字段 在缺失的地方补齐。
方法:不去做国际化适配,或者一个个适配对应好。
查看签名证书
指令
C:\Program Files\Java\jdk1.8.0_131\bin>keytool -list -keystore E:\Android\Sign\base.jks
需要输入 签名的密码
在微信开发平台中申请了应用,但是还未审批通过。
问题:应用安装后无法获取百度地图的位置信息。
后来发现是手机没有给相应的权限。打开相应的权限即可。
但是为什么安装应用时并没有权限提示?
百度地图和环信的冲突问题。可以查看今天博客中收藏的两篇文章。但是今天并不是按照他们的方法解决的。而是将百度地图的jar包和so文件都放入 easeUI中。就能够很好地解决了。
7.20
7.21
Activity接收到点击事件ACTION_DOWN后 会调用dispatchTouchEvent方法将它直接分发给Window的同名方法中去,如果返回false
则调用Activity自己的onTouchEvent处理。
Window是一个抽象类 其具体的实现类是PhoneWindow 在其dispatchTouchEvent方法中会将点击事件交给DecorView处理。DecorView就是根视图,其继承自FrameLayout
就是一个ViewGroup。
点击事件 如果不拦截
会先一直传递到控件树的最低端view
如果该view或viewGroup不处理会向上传递。
在每一层中,顺序为:onTouch()->onTouchEvent()->onClick()->向上传递;
(实际上setOnTouchListener()设置的是onTouch());
viewGroup中
一旦
拦截了DOWN那么这一个事件序列就会默认交给他处理。不再调用onInterceptTouchEvent()方法。但是 对于DOWN事件
依旧会调用。(注意FLAG_DISALLOW_INTERCEPT标志位)
viewGroup向子元素分发事件时 子元素要能接收到事件(在播动画,大小包括了点击事件的坐标)
View中
不可用状态的View依然可能会消耗点击事件(button.setEnabled(false),取决于他的相关方法的返回值)
如果view设置有代理,那么会执行代理的onTouchEvent方法。
View中有两个标志位CLICKABLE和LONG_CLICKABLE。只要有一个为true,就会消耗点击事件。LONG_CLICKABLE默认都为false,除非为他设置了长按事件或者手动设置了该标志位。CLICKABLE则不同控件不一样(Button为true,Text为false)
onTouch和onTouchEvent 就是针对每一个ACTION都会运行一次。而onClick 针对的是DOWN和UP组成的事件组才构成click事件。只运行一次。
如果只希望运行一次 可以在其中对ACTION做判断。
7.22
问题:Fragment嵌套Fragment中 内层Fragment 在外层Fragment切换过之后 不显示内容。
解决方法。在内层Fragment中使用getChildFragmentManager()来获得FragmentManager对象(代替了getWindow().getFragmentManager())
原因:。。。。就是要用这个。
View的measure过程
Measure会调用OnMeasure方法。
onMeasure方法调用setMeaSuredDimension()方法来设置View的宽高。
而宽高则通过调用
getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec)
这个方法中通过MeasureSpec中的测量模式不同返回不同的值。
case MeasureSpec.AT_MOST:
case MeasureSpec.EXACTLY:
这两种模式下
都返回onMeasure方法传入的值。也就是measure测量后的值(但不是最终值,最终值要在Layout中确定。但是一般最终值和测量值是一致的,这取决于LayouParms。)
MeasureSpec.UNSPECIFIED(一般用于系统内部的测量)
从源码中可以看出来,在这种模式下 getDefaultSize返回的值取决于传入的第一个参数Size。而这个参数是在OnMeasure中由getSuggestMinimumWidth()和getSuggestMinimumHeight()决定的。
这里两个方法是类似的:
如果没有背景 则返回mMinWidth(取决于android:minWidth属性,默认为0)
如果有背景 则返回mMinWidth和背景宽度的最大值。(背景宽度就是Drawable的原始值,ShapDrawable无原始宽高,而BitmapDrawable有原始宽高)
总结:OnMeasure方法中。
测量模式
为UNSPECIFIED时
返回Android:minWidth的值(默认0) 或者设了背景时比minWidth大的背景的宽。
其他模式下:返回measure中测量出的测量值。
疑惑点:ViewGroup中没有Measure方法 也没有OnMeasure方法。且View中的measure方法为final不能被重写。那么是谁调用了。ViewGroup当中的measureChildren等方法。
解答:ViewGroup是一个抽象类。继承他时应该重写onMeasure方法(位于view中)。在这里面调用这些测量方法。(参考FrameLayout)
7.24
View view= LayoutInflater.from(context).inflate(R.layout.collection_item,parent,false);
MyHolder holder=new MyHolder(view);
return holder;
final
CollectionBean bean=data.get(position);
MyHolder myHolder= (MyHolder) holder;
myHolder.movieTitle.setText(bean.getTitle());
myHolder.collectionTime.setText(bean.getData());
Picasso.with(context).load(bean.getURL()).into(myHolder.movieImage);
myHolder.movieLayout.setOnClickListener(new
View.OnClickListener() {
@Override
public void
onClick(View v) {
Intent intent=new Intent(context, MovieInfoActivity.class);
intent.putExtra("id",bean.getId());
context.startActivity(intent);
}
});
7.25
http://blog.csdn.net/qq_35166847/article/details/51814409
Picasso和Glide的优缺点。
内存开销:Picasso大于Glide。
图片质量:picasso好于Glide。(但是很微弱)
加载速度:Glide比较快。
库的大小,和方法数:Glide大于Picasso
GIF:仅Glide支持。
原因:Picasso总是缓存全尺寸大小的图片,而Glide选择缓存和ImageView大小一致的尺寸。但是这种策略导致,Glide每次都要重新下载一次尺寸不一样的图片,网络开销大。但是Glide的显示速度也比较快。因为picasso每次都要重新调整全尺寸图片的大小。
(策略都可以改变。)
同时因为Glide和Activity/Fragment的生命周期是一致的,因此gif的动画也会自动的随着Activity/Fragment的状态暂停、重放。Glide
的缓存在gif这里也是一样,调整大小然后缓存。
问题:签名打包时遇到问题。(Fragment中Google建议使用某种构造方式。)
Error:Error: Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead [ValidFragment]
解决:在类之前添加如下代码 @SuppressLint("ValidFragment") 注意不用吧ValidFragment改成你的类名。
出错解析:参考http://blog.csdn.net/anobodykey/article/details/22503413。
但是这一篇解决的方法比较复杂,按Google官方推荐的方式写。要改的地方太多了。于是我决定 还是直接忽略了。
7.26
RecycleView的吸顶实现
实现思路:
1、在外界布局中
顶上包含(include)一个吸顶布局。在RecycleView的每一个Item布局中包含(include)同一个吸顶布局。在bindingViewHolder中判断每一个Item是不是和前一个Item相同(属于同一个组),以此显示或不显示。再在外界给RecycleView设置一个addOnScrollListener。判断外界布局中吸顶布局的显示和移动。
(缺点:耦合度太高。)
2、重写一个RecyclerView.ItemDecoration 判断与前一个item是否相同来确定是否绘制吸顶布局(实际就是分割线)。
View的measure之MeasureSpec的创建使用。
1、对于DecorView,其MeasureSpec由窗口尺寸和自身的LayoutParams(布局属性:就是match-parent那些)。
在ViewRootImpl中measureHierarchy这一方法为DecorView创建了MeasureSpec。
很明显:ViewRootImpl根据windowSize和rootDimension(其实就是窗口的布局属性)创建了不同的MeasureSpec。具体规则如下:
ViewGroup.LayoutParams.MATCH_PARENT: 精准模式 EXACTLY 大小就是窗口大小
ViewGroup.LayoutParams.WRAP_CONTENT: 最大模式 AT_MOST
大小不定,但是不能超过指定窗口大小。
固定大小(100dp):精准模式
EXACTLY 大小为rootDimension(设置的大小100dp)指定的大小。
2、对于普通View,其MeasureSpec由父容器的MeasureSpec和自身的LayoutParams来决定。
首先普通View的measure过程是由ViewGroup传递过来的,由ViewGroup中的OnMeasure来调用ViewGroup中的几个用于测量的方法。比如:measureChildWithMargins:
很明显在measureChildWithMargins方法中首先获得了。子View的LayoutParams。然后通过将传入的parentWithMeasure和经过处理的子View的属性传入getChildMeasureSpec方法。来获得子元素的MeasureSpec。
而getChildMeasureSpec方法参数:
int spec :父控件的MeasureSpec
Int padding: 父容器中已占的空间大小
Int childDimension:子View想要获得的大小
在获取到参数之后,有确定了几个属性。最后
Swich(specMode){
Case MeasureSpec.EXACTLY:
If(childDimension>=0){
}elseif(...)
}
结果可以用一张表来表示:
parentSpecMode ChildDimension | EXACTLY | AT_MOST | UNSPECIFIED |
dp/px | EXACTLY childSize | EXACTLY childSize | EXACTLY childSize |
match_parent | EXACTLY parentSize | EXACTLY parentSize | UNSPECIFIED 0 |
wrap_Content | AT_MOST parentSize | AT_MOST parentSize | UNSPECIFIED 0 |
(注:返回结果就是将中间的两个值放入resultSize和resultMode中,而childSize指childDimension,parentSize指size就是父容器剩余的空间)
return MeasureSpec.makeMeasureSpec(resultSize, resultMode);
最后返回一个MeasureSpec(int类型的32位数)
View的Measure过程之ViewGroup的Measure过程
之前有提到过由于View当中的measure方法是final类型的,无法在ViewGroup中重写。所以ViewGroup中不提供measure方法。而选择在OnMeasure方法(自己继承ViewGroup这个抽象类时重写)调用ViewGroup提供的几种方法。
MeasureChildren方法:
就是遍历所有子View调用measureChild方法测量
MeasureChild方法:
类似于之前讲解过的measureChildWithMargins方法。这里就不再次讲了。
measureChildWithMargins方法:
疑问:measureChild和measureChildWithMargins方法有何区别?
就是多了两个参数(widthUsed和HeightUsed),并把他们放入了父容器已占有的空间。
7.27
三次握手与四次挥手:
SYN:联机标志位 当其为1时表示这是用来三次握手的数据。
ACK:确认标志位 当其为1时表示这是用来确认的数据。(貌似除了第一次数据之外 之后的都为1)
FIN:结束标志位 当其不为0时表示这书请求结束的一次数据。(貌似其大小代表了这次结束请求的编号)
seq:发送序号 一般为上一次收到的数据中的ack(确认序号),第一个发送序号由双方随机产生。(注意两边的发送序号是不一样的)
ack:确认序号 为上一次接受到的发送序号加一(seq+1)
状态:
SYN_SENT:客户端发送请求连接后等待服务器应答状态。
SYN_RCVD:服务端收到客户端请求连接后等待客户端回复状态。
ESTABLISHED:三次握手完成正常通信状态。
FIN_WAIT_1,FIN_WAIT_2:客户端发送结束请求后进入1,收到服务端回复进入2。
LAST_ACK:服务器发送结束请求后等待客户端应答。
TIME_WAIT:客户端收到服务器的结束请求后进入。(TIME_WAIT状态等待2倍MSL,用于确保本次连接的所有数据都消失在网络中。)
CLOSED:服务端收到客户端的结束应答,后进入关闭状态。而客户端等待两倍MSL进入
(1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack
(number )=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
(3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。
(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
网络分层与网络协议:
普通分为四层:应用层,传输层,网络层,链路层。
应用层协议
应用层 | HTTP/FTP | |
传输层 | TCP/UDP | |
网络层 | ARP/RARP | |
链路层 | 边际网关协议,最短路径协议 | 一些路由协议 |
7.31
除了调用 startAnimation() ,另一种处理方式是通过Animation.setStartTime()方法定义一个开始时间,然后通过View.setAnimation()方法把这个动画赋给控件即可。
如果你设置了animation的启动时间(setStartTime)但是却调用startAnimation
这个启动时间是没有用的:
明显将开始时间设为了一个固定值。然后调用setAnimation()
动画两个重要部分:
插值器(TimeInterpolator):计算时间流逝和值变化的比例(返回值0到1之间)
估值器(IntEvaluator):计算变化后的实际值。
(上面两个都是例子 还有别的类型的插值器和估值器)
八大排序算法:
直接插入:就是一个个往之前的数组里面插入。
希尔排序:选择一个增量(k),然后把在k+i,2k+i,3K+i....这组数中插入排序(然后把i递增,直至所有数都在某一组)。然后缩小增量,直至k=1;
直接选择:把所有数选出最小的放在第一个,选出第二小的放在第二个.......直至选完(改良版,可以一次选一个最大,选一个最小。)
堆排序 :把所有的数,构成一个堆(实际上是数组,父节点为i,那么子节点是2i+1,2i+2),父节点大于两个子节点(大顶堆)。
去掉顶点然后将最后一个数变为顶点。(渗透函数)
冒泡排序:
快速排序:选定一个标准值k(一般为第一个或最后一个),与low和high指针不断比较(一开始low和high在第一个和最后一个)然后每当其中一个和k的大小有问题时,交换low和high(没问题就每次移动一次指针,直至指针对比有问题。或者low=high)。以此找到标准值在数组中准确位置(k的左边都小于k,右边都大于k)
。然后对左右数组重复这个过程。就可以排序完成了。
归并排序:
基数排序:多应用于多关键字类型的排序(但不是只)。(参考给扑克整理顺序的方式,先按花色分好。然后花色内部大小排序。然后将花色组按顺序排。)空间开销大,且只适用于预先知道大小和类型的数据。
相关文章推荐
- 公司实习SEO优化日记:2016年2月16日
- 文奇的WY实习连载日记3.16-我真垃圾
- 实习日记第一天——环境配置, ofbiz, Android, https
- 转贴的几个小技巧,什么时候有空了整理一下
- java project 和 javaWeb的读取文件路径问题(整理自百度经验,有空验证下)
- 日记整理---->2016-11-22
- 实习日记014(0804)
- 安卓实习期间整理知识点(十一)
- 实习日记039(9月14日)
- 实习日记041(9月16日)
- 实习日记)select option 选择不同的option时, 页面发生不同的变化
- 4.28 JEE实习日记
- 实习日记052(10月17日)
- 实习整理(十三)
- 网络工程师成长日记306-西安保时捷项目实习感想
- 实习日记->第一天
- ATA实习日记(序)
- ATA实习日记(七)——临近城塌
- 实习日记9
- 实习日记11