临时记录

来源:互联网 发布:帝国cms支付宝接口 编辑:程序博客网 时间:2024/06/05 00:31


1、网络库、网络框架
说明其各个的优缺点,说明自己使用的体会


网络库(实现方式的理解对比几个图片加载库)
httpClient
早时候的sdk自带的同步网络库,现在已经废弃了(性能和缓存上原因,且只支持同步)
自己写的话配合AsyncTask也挺好用


android-async-http 封装httpClient的异步网络库


volley 封装httpUrlConnection的异步网络库,实现了http协议缓存,虽然也可以切换okHttp,但要需要熟悉里的接口
定位是轻量级网络交互,适合大量的,小数据传输
缺点:1、不支持同步,会限制开发模式
2、不能post大数据,所以不适合用来上传文件。


okhttp 高性能同步异步底层网络库,api简洁友好,优雅的缓存机制(对比UIL自己做的文件缓存,完全没有使用http层面的缓存)
是基于http协议封装的一套请求客户端,虽然它也可以开线程,但根本上它更偏向真正的请求,跟HttpClient, HttpUrlConnection的职责是一样的。


网络框架
volley、retrofit、android-async-http 
封装了具体请求,解决了 参数传递、线程切换、数据解析 这些业务工作


retrofit 封装http的网络请求框架,简化了网络请求流程,通过注解方便发起各种请求,可以无需要任何包装直接在项目中使用。支持rxjava;



2、几种启动模式的应用场景

   a、一健退出应用,对主页应用singleTask模式,需要退出时 start主页,在主页的onNewIntent中 finish主页, 实现清理主页之上的所有Activity的目的.


singleTop  栈顶复用
使用场景:资讯阅读类 APP 的内容界面。 
举例:今日头条就是这种方式 singleTop + onNewIntent

singleTask  栈内复用,并清除之上的Activity
大部分app的主页,但从产品设计上来说,这种从其它界面直接打开主页 并清除之上的界面 的设计也是非常不合理的

singleInstance
建新栈,并复用此栈 + onNewIntent()

相关问题:
问题一:Act1通过 startActivityForResult 启动的Activity2,而Act2 在Manifest.xml中为 singleTask模式,这时Act1的onActivity会立即被调用
问题一答案:Android 5.0 之后修复了这个问题。

问题一的引申问题:

虽然5.0之后的singleTask模式 已经解决了 会立即 回调 Act1的onActivityResult  的问题。

但 5.0之后  intent中设置为 FLAG_ACTIVITY_NEW_TASK 时仍然会有这个问题
总结:只要不和原来的 Activity 在同一个 Task ,就会产生这种立即执行 onActivityResult() 的问题



3、键盘跳跃的处理 指的是 什么?



4、Choreographer基本原理就是能接受每次的Vsync信号,然后依次处理跟UI相关的事件(依次是Input触摸事件(例如你的手指滑动)、动画、绘图)。

如何查看源码,在ValueAnimator里 找到  ValueAnimator.start() 方法,在此方法里找到 AnimationHandler , 在这个类里找到
private final Choreographer.FrameCallback mFrameCallback = new Choreographer.FrameCallback() {    @Override    public void doFrame(long frameTimeNanos) {        doAnimationFrame(getProvider().getFrameTime());        if (mAnimationCallbacks.size() > 0) {            getProvider().postFrameCallback(this);        }    }};

发现 Choreographer 后 就是我们要找的接收 Vsync 信号 的处理类, 它里面的  voiddoFrame(longframeTimeNanos, intframe)  方法就是用来 处理 每一次 Vsync垂直信号 的,从这个方法里面,可以找到这么一段
try {    Trace.traceBegin(Trace.TRACE_TAG_VIEW, "Choreographer#doFrame");    AnimationUtils.lockAnimationClock(frameTimeNanos / TimeUtils.NANOS_PER_MS);    mFrameInfo.markInputHandlingStart();    doCallbacks(Choreographer.CALLBACK_INPUT, frameTimeNanos);    mFrameInfo.markAnimationsStart();    doCallbacks(Choreographer.CALLBACK_ANIMATION, frameTimeNanos);    mFrameInfo.markPerformTraversalsStart();    doCallbacks(Choreographer.CALLBACK_TRAVERSAL, frameTimeNanos);    doCallbacks(Choreographer.CALLBACK_COMMIT, frameTimeNanos);} finally {    AnimationUtils.unlockAnimationClock();    Trace.traceEnd(Trace.TRACE_TAG_VIEW);}

这里可以看出, 处理每一次垂直信号时,先处理 用户输入的屏幕触摸事件,然后处理 动画播放,最后处理 view的 测量布局绘制, CALLBACK_COMMIT是指什么,我暂也不知道。


APP的动画的驱动模式了: Vsync--->编舞者(即Choreographer.java)--->AnimationHandler--->ValueAnimator--->APP设定的回调


5、一个ImageView 的 android:src 设置为 .9,同时 scaleType 设置为 centerCrop,最张效果会怎样?  如果是 android:background设置为 .9图片, 同时 scaleType 设置为 centerCrop,最张效果会怎样?



6、Glide 3.7 用法阅读体会


glide thumbnail 的具体应用场景?


glide的into里 用 匿名内部类 的 SimpleTarget 为啥可能 被GC回收? 
难道是 3.7的源码是用 弱引用持有 into的对象? 而4.0修复了这个问题


SimpleTarget target 定义时 声明 不能带上 泛型,否则into时报错


transformation 可以对图片的任意属性:尺寸,范围,颜色,像素位置等等进行变换,Glide 已经包含了2个 ,我们之前已经看了图像重设大小,即:fitCenter 和 centerCrop


对 transform 确保你只调用了一次 .transform() 或 .bitmapTransform(),否则,之前的配置就会被覆盖掉的!然而,你还是可以运用多种转换的,通过传递多个转换对象作为参数传给 .transform() 或 .bitmapTransform()。


提示:当你用了 transform 转换后你就不能使用 .centerCrop() 或 .fitCenter() 了。因为CenterCrop 就是 继承自BitmapTransformation,而重复设置transform是会被覆盖的


animate 动画仅仅用于不从缓存中加载的情况。如果图片被缓存过了,它的显示是非常快的,因此动画是没有必要的,并且不显示的。


anim xml动画资源文件只能用于 target是 ImageView 的场景;如果target是自定义View, 请使用 ViewPropertyAnimation.Animator  


7、glide 4.0 的一些细节


1、Fallback Drawables are shown when the requested url/model is null


2、transform 只会应用到 要加载的资源图片上,不会应用到 placeHolder、fallback、error占位符上


3、Glide 4 默认使用 ARGB_8888


4、transform 改为 TransitionOptions, 禁用过度动画请使用 TransitionOptions.dontTransition()


5、transform 和 transition 的区别 ?


6、options1.override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)


原创粉丝点击