【实习日记】未整理,有空再整理

问题:

 

关于ChatDemo导入的问题。

关于对话列表Item的点击事件。

 

 

7.19

总结:在项目中导入了百度地图SDK

 

在环信的项目中集成百度地图  应当将.so文件和.jar包都放在你依赖的easyUIModule中。这样就能比较快的集成。

 

在签名生成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

如果该viewviewGroup不处理会向上传递。

在每一层中,顺序为: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(取决于androidminWidth属性,默认为0

如果有背景    则返回mMinWidth和背景宽度的最大值。(背景宽度就是Drawable的原始值,ShapDrawable无原始宽高,而BitmapDrawable有原始宽高)

 

总结:OnMeasure方法中。

测量模式 UNSPECIFIED 返回AndroidminWidth的值(默认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

 

PicassoGlide的优缺点。

 

内存开销:Picasso大于Glide

图片质量:picasso好于Glide。(但是很微弱)

加载速度:Glide比较快。

库的大小,和方法数:Glide大于Picasso

GIF:仅Glide支持。

 

原因:Picasso总是缓存全尺寸大小的图片,而Glide选择缓存和ImageView大小一致的尺寸。但是这种策略导致,Glide每次都要重新下载一次尺寸不一样的图片,网络开销大。但是Glide的显示速度也比较快。因为picasso每次都要重新调整全尺寸图片的大小。

(策略都可以改变。)

同时因为GlideActivity/Fragment的生命周期是一致的,因此gif的动画也会自动的随着Activity/Fragment的状态暂停、重放。Glide 的缓存在gif这里也是一样,调整大小然后缓存。

 

 

 

 

问题:签名打包时遇到问题。(FragmentGoogle建议使用某种构造方式。)

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是否相同来确定是否绘制吸顶布局(实际就是分割线)。

 

 

ViewmeasureMeasureSpec的创建使用。

 

1、对于DecorView,其MeasureSpec由窗口尺寸和自身的LayoutParams(布局属性:就是match-parent那些)。

ViewRootImplmeasureHierarchy这一方法为DecorView创建了MeasureSpec

 

 

很明显:ViewRootImpl根据windowSizerootDimension(其实就是窗口的布局属性)创建了不同的MeasureSpec。具体规则如下:

 

ViewGroup.LayoutParams.MATCH_PARENT: 精准模式 EXACTLY  大小就是窗口大小

ViewGroup.LayoutParams.WRAP_CONTENT: 最大模式 AT_MOST 大小不定,但是不能超过指定窗口大小。

固定大小(100dp):精准模式 EXACTLY  大小为rootDimension(设置的大小100dp)指定的大小。

 

2、对于普通View,其MeasureSpec由父容器的MeasureSpec和自身的LayoutParams来决定。

首先普通Viewmeasure过程是由ViewGroup传递过来的,由ViewGroup中的OnMeasure来调用ViewGroup中的几个用于测量的方法。比如:measureChildWithMargins

 

很明显在measureChildWithMargins方法中首先获得了。子ViewLayoutParams。然后通过将传入的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

 

(注:返回结果就是将中间的两个值放入resultSizeresultMode中,而childSizechildDimensionparentSizesize就是父容器剩余的空间)

 

return MeasureSpec.makeMeasureSpec(resultSize, resultMode);

最后返回一个MeasureSpecint类型的32位数)

 

 

ViewMeasure过程之ViewGroupMeasure过程

 

之前有提到过由于View当中的measure方法是final类型的,无法在ViewGroup中重写。所以ViewGroup中不提供measure方法。而选择在OnMeasure方法(自己继承ViewGroup这个抽象类时重写)调用ViewGroup提供的几种方法。

MeasureChildren方法:

 

 

就是遍历所有子View调用measureChild方法测量

 

MeasureChild方法:

 

类似于之前讲解过的measureChildWithMargins方法。这里就不再次讲了。

measureChildWithMargins方法:

 

 

疑问:measureChildmeasureChildWithMargins方法有何区别?

就是多了两个参数(widthUsedHeightUsed),并把他们放入了父容器已占有的空间。

 

 

 

 

7.27

三次握手与四次挥手:

 

SYN:联机标志位  当其为1时表示这是用来三次握手的数据。

ACK:确认标志位  当其为1时表示这是用来确认的数据。(貌似除了第一次数据之外 之后的都为1

FIN:结束标志位   当其不为0时表示这书请求结束的一次数据。(貌似其大小代表了这次结束请求的编号)

 

seq:发送序号  一般为上一次收到的数据中的ack(确认序号),第一个发送序号由双方随机产生。(注意两边的发送序号是不一样的)

ack:确认序号  为上一次接受到的发送序号加一(seq+1

 

 

状态:

SYN_SENT:客户端发送请求连接后等待服务器应答状态。

SYN_RCVD:服务端收到客户端请求连接后等待客户端回复状态。

ESTABLISHED:三次握手完成正常通信状态。

FIN_WAIT_1FIN_WAIT_2:客户端发送结束请求后进入1,收到服务端回复进入2

LAST_ACK服务器发送结束请求后等待客户端应答。

TIME_WAIT客户端收到服务器的结束请求后进入。(TIME_WAIT状态等待2MSL用于确保本次连接的所有数据都消失在网络中。

CLOSED服务端收到客户端的结束应答,后进入关闭状态。而客户端等待两倍MSL进入

 

1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给ServerClient进入SYN_SENT状态,等待Server确认。

 

  2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYNACK都置为1ack (number )=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

 

  3)第三次握手:Client收到确认后,检查ack是否为J+1ACK是否为1,如果正确则将标志位ACK置为1ack=K+1,并将该数据包发送给ServerServer检查ack是否为K+1ACK是否为1,如果正确则连接建立成功,ClientServer进入ESTABLISHED状态,完成三次握手,随后ClientServer之间可以开始传输数据了。

 

 

由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。

 1)第一次挥手:Client发送一个FIN,用来关闭ClientServer的数据传送,Client进入FIN_WAIT_1状态。

  2)第二次挥手:Server收到FIN后,发送一个ACKClient,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。

 3)第三次挥手:Server发送一个FIN,用来关闭ServerClient的数据传送,Server进入LAST_ACK状态。

  4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACKServer,确认序号为收到序号+1Server进入CLOSED状态,完成四次挥手。

 

 

 

网络分层与网络协议:

 

普通分为四层:应用层,传输层,网络层,链路层。

 

应用层协议

应用层

HTTP/FTP

 

传输层

TCP/UDP

 

网络层

ARP/RARP

 

链路层

边际网关协议,最短路径协议

一些路由协议

 

 

 

 

 

7.31

除了调用 startAnimation() ,另一种处理方式是通过Animation.setStartTime()方法定义一个开始时间,然后通过View.setAnimation()方法把这个动画赋给控件即可。

 

如果你设置了animation的启动时间(setStartTime)但是却调用startAnimation  这个启动时间是没有用的:

 

 

明显将开始时间设为了一个固定值。然后调用setAnimation()

 

动画两个重要部分:

插值器(TimeInterpolator):计算时间流逝和值变化的比例(返回值01之间)

估值器(IntEvaluator):计算变化后的实际值。

(上面两个都是例子  还有别的类型的插值器和估值器)

 

 

八大排序算法:

 

 

 

直接插入:就是一个个往之前的数组里面插入。

希尔排序:选择一个增量(k),然后把在k+i2k+i3K+i....这组数中插入排序(然后把i递增,直至所有数都在某一组)。然后缩小增量,直至k=1

直接选择:把所有数选出最小的放在第一个,选出第二小的放在第二个.......直至选完(改良版,可以一次选一个最大,选一个最小。)

堆排序  :把所有的数,构成一个堆(实际上是数组,父节点为i,那么子节点是2i+12i+2),父节点大于两个子节点(大顶堆)。   去掉顶点然后将最后一个数变为顶点。(渗透函数)

冒泡排序:

快速排序:选定一个标准值k(一般为第一个或最后一个),与lowhigh指针不断比较(一开始lowhigh在第一个和最后一个)然后每当其中一个和k的大小有问题时,交换lowhigh(没问题就每次移动一次指针,直至指针对比有问题。或者low=high)。以此找到标准值在数组中准确位置(k的左边都小于k,右边都大于k) 。然后对左右数组重复这个过程。就可以排序完成了。

归并排序:

基数排序:多应用于多关键字类型的排序(但不是只)。(参考给扑克整理顺序的方式,先按花色分好。然后花色内部大小排序。然后将花色组按顺序排。)空间开销大,且只适用于预先知道大小和类型的数据。

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

Demonskp

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值