android个人理解语言话术知识点2

一.asyncTask:主要是由线程池和handler来实现完成,主要是有个生命周期,可以灵活的与ui线程进行ui刷新。

第1个参数:启动时输入的参数类型

第2个参数::后台运行时的进度值

第3个参数::结束时返回结果的类型.

二.handlerThread:继承的Thread,主要有handler,Thread,looper来执行完成的,主要区分别创建线程时,会创建一个looper,通过单线程来实现。

三.retrofit:将一个java接口封装成一个http请求,里面的网络请求最终调用okhttp中的call请求

四.Butterknife:主要是通过注解的来实现初始化,并没有通过反射,当java编译时,先扫描注解,通过注解生成一个bindview的类,当定义控件时必须是public方法。

1)、在Activity 类中绑定 :ButterKnife.bind(this);必须在setContentView();之后绑定;且父类bind绑定后,子类不需要再bind。

2)、在非Activity 类(eg:Fragment、ViewHold)中绑定: ButterKnife.bind(this,view);这里的this不能替换成getActivity()。

3)、在Activity中不需要做解绑操作,在Fragment 中必须在onDestroyView()中做解绑操作。

4)、使用ButterKnife修饰的方法和控件,不能用private or static 修饰,否则会报错。错误: @BindView fields must not be private or static. (com.zyj.wifi.ButterknifeActivity.button1)

扫描二维码关注公众号,回复: 2601208 查看本文章

5)、setContentView()不能通过注解实现。(其他的有些注解框架可以)

6)、使用Activity为根视图绑定任意对象时,如果你使用类似MVC的设计模式你可以在Activity 调用ButterKnife.bind(this, activity),来绑定Controller。

7)、使用ButterKnife.bind(this,view)绑定一个view的子节点字段。如果你在子View的布局里或者自定义view的构造方法里 使用了inflate,你可以立刻调用此方法。或者,从XML inflate来的自定义view类型可以在onFinishInflate回调方法中使用它。

五.synchronized,volatile:

synchronized性能没有lovatile好,synchronized主要用于同步当前对象,方法,变量,当其他线程调用该对象时,要排队等待,里面主要是lock机制;

volatile主要用来修饰变量,将变量赋值后立即存放到主内存中,并且会通知其他调用该变量线程,当获取该变量都是从主内存中获取;没有修饰的话,变量赋值后会先放在线程中的内存中,并没有及时更新到主内存中。

六.view的绘制:是由ViewRootImpl层来绘制的,主要是有measure,layout,draw
 invalidate:只会调用onDraw方法在ui线程中更新view;
 postInvalidate是在非UI线程中调用;
 requestLayout:当当前view位置或大小变化时,通知父控件进行重新的绘制,调用onMeasure,onlayout来重新测量view;
 所以当我们进行view更新,内容没有变化,只是view的大小,位置没有发生变化,只会调用invalidate方法,则会调用requestLayout方法;若是都发生变化,会按照view的绘制流程,先执行requesLayout方法,在invalidate.

七 .listview和recycleview的缓存机制:

activeViews主要是在当前屏幕上的view快速更新重用,主要是在notify的时候,则不需要createView和bindView,跟mAttachedScrap一样;还有mCatchViews,主要是缓存屏幕外两个view,默认是两个;

scrapViews主要是缓存移除屏幕的itemview,让那些即将进入屏幕的itemview取scrapviews中的view,不用再执行createView,但要执行bindView,跟mReyclerViewPool一样;

RecycleView的优势在于mCatchViews,可以缓存屏幕外view,进入屏幕的时候无需bindview;

缓存不同:

1). RecyclerView缓存RecyclerView.ViewHolder,抽象可理解为: View + ViewHolder(避免每次createView时调用findViewById) + flag(标识状态);

2). ListView缓存View。

当调用fill()中RecyclerView.getViewForPosition(pos)时,RecyclerView通过对pos和flag的预处理,使得bindview只调用一次.

需要指出,ListView和RecyclerView最大的区别在于数据源改变时的缓存的处理逻辑,ListView是"一锅端",将所有的mActiveViews都移入了二级缓存mScrapViews,而RecyclerView则是更加灵活地对每个View修改标志位,区分是否重新bindView。

这篇文章分析的很好https://cloud.tencent.com/developer/article/1005658

八:hotfix原理:

主要是dexClassLoader和pathClassLoader两个方法,BaseDexClassLoader中有个dexElements的数组,先将下发的apk包通过ClassLoader去遍历修改后的dexElement文件,将它放到dexElements数组的前面,当类加载到crash的位置时,会优先去数组前面的。

九.cookie与session的区别

cookie是服务器端发送给客户的的特殊信息,以文件存储的方式存储在本地,然后客户端每次请求服务器在带过去。

 session是保存在服务端的客户的一些状态数据,同时会生成一个唯一的id,通过id来获取用户身份。

 十.activity和fragment结合起来的生命周期:

十一.静态方法变量是jvm运行的时候就存放在内存中(方法区),所分配的内存会一直存在,直到程序退出才会释放内存。

堆:主要存放new的对象;

栈:主要存放一些基本类型变量,对象的引用地址,当一个方法执行完毕,里面的基本变量和对象的引用会被释放。

猜你喜欢

转载自blog.csdn.net/AnthonyDJG/article/details/81178902