当前位置: 首页 > news >正文

成都网站建设四川推来客网络Wordpress取消侧边栏

成都网站建设四川推来客网络,Wordpress取消侧边栏,南昌企业建站,郑州小程序开发公司熟悉Android系统的童鞋都知道#xff0c;系统出于体验和性能上的考虑#xff0c;app在退到后台时系统并不会真正的kill掉这个进程#xff0c;而是将其缓存起来。打开的应用越多#xff0c;后台缓存的进程也越多。在系统内存不足的情况下#xff0c;系统开始依据自身的一套…熟悉Android系统的童鞋都知道系统出于体验和性能上的考虑app在退到后台时系统并不会真正的kill掉这个进程而是将其缓存起来。打开的应用越多后台缓存的进程也越多。在系统内存不足的情况下系统开始依据自身的一套进程回收机制来判断要kill掉哪些进程以腾出内存来供给需要的app。这套杀进程回收内存的机制就叫 Low Memory Killer 它是基于Linux内核的 OOM KillerOut-Of-Memory killer机制诞生。 进程的重要性划分5级-前台进程 (Foreground process)可见进程 (Visible process)服务进程 (Service process)后台进程 (Background process)空进程 (Empty process) 了解完 Low Memory Killer再科普一下oom_adj。什么是oom_adj它是linux内核分配给每个系统进程的一个值代表进程的优先级进程回收机制就是根据这个优先级来决定是否进行回收。对于oom_adj的作用你只需要记住以下几点即可 进程的oom_adj越大表示此进程优先级越低越容易被杀回收越小表示进程优先级越高越不容易被杀回收 普通app进程的oom_adj0,系统进程的oom_adj才可能0 有些手机厂商把这些知名的app放入了自己的白名单中保证了进程不死来提高用户体验如微信、QQ、陌陌都在小米的白名单中。如果从白名单中移除他们终究还是和普通app一样躲避不了被杀的命运为了尽量避免被杀还是老老实实去做好优化工作吧。 所以进程保活的根本方案终究还是回到了性能优化上进程永生不死终究是个彻头彻尾的伪命题 8、讲解一下Context Context是一个抽象基类。在翻译为上下文也可以理解为环境是提供一些程序的运行环境基础信息。Context下有两个子类ContextWrapper是上下文功能的封装类而ContextImpl则是上下文功能的实现类。而ContextWrapper又有三个直接的子类 ContextThemeWrapper、Service和Application。其中ContextThemeWrapper是一个带主题的封装类而它有一个直接子类就是Activity所以Activity和Service以及Application的Context是不一样的只有Activity需要主题Service不需要主题。Context一共有三种类型分别是Application、Activity和Service。这三个类虽然分别各种承担着不同的作用但它们都属于Context的一种而它们具体Context的功能则是由ContextImpl类去实现的因此在绝大多数场景下Activity、Service和Application这三种类型的Context都是可以通用的。不过有几种场景比较特殊比如启动Activity还有弹出Dialog。出于安全原因的考虑Android是不允许Activity或Dialog凭空出现的一个Activity的启动必须要建立在另一个Activity的基础之上也就是以此形成的返回栈。而Dialog则必须在一个Activity上面弹出除非是System Alert类型的Dialog因此在这种场景下我们只能使用Activity类型的Context否则将会出错。 getApplicationContext()和getApplication()方法得到的对象都是同一个application对象只是对象的类型不一样。 Context数量 Activity数量 Service数量 1 1为Application 9、理解ActivityView,Window三者关系 这个问题真的很不好回答。所以这里先来个算是比较恰当的比喻来形容下它们的关系吧。Activity像一个工匠控制单元Window像窗户承载模型View像窗花显示视图LayoutInflater像剪刀Xml配置像窗花图纸。 1Activity构造的时候会初始化一个Window准确的说是PhoneWindow。2这个PhoneWindow有一个“ViewRoot”这个“ViewRoot”是一个View或者说ViewGroup是最初始的根视图。3“ViewRoot”通过addView方法来一个个的添加View。比如TextViewButton等4这些View的事件监听是由WindowManagerService来接受消息并且回调Activity函数。比如onClickListeneronKeyDown等。 10、四种LaunchMode及其使用场景 此处延伸栈(First In Last Out)与队列(First In First Out)的区别 栈与队列的区别 队列先进先出栈先进后出 \2. 对插入和删除操作的”限定”。 栈是限定只能在表的一端进行插入和删除操作的线性表。 队列是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。 \3. 遍历数据速度不同 standard 模式 这是默认模式每次激活Activity时都会创建Activity实例并放入任务栈中。使用场景大多数Activity。 singleTop 模式 如果在任务的栈顶正好存在该Activity的实例就重用该实例( 会调用实例的 onNewIntent() )否则就会创建新的实例并放入栈顶即使栈中已经存在该Activity的实例只要不在栈顶都会创建新的实例。使用场景如新闻类或者阅读类App的内容页面。 singleTask 模式 如果在栈中已经有该Activity的实例就重用该实例(会调用实例的 onNewIntent() )。重用时会让该实例回到栈顶因此在它上面的实例将会被移出栈。如果栈中不存在该实例将会创建新的实例放入栈中。使用场景如浏览器的主界面。不管从多少个应用启动浏览器只会启动主界面一次其余情况都会走onNewIntent并且会清空主界面上面的其他页面。 singleInstance 模式 在一个新栈中创建该Activity的实例并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中任何应用再激活该Activity时都会重用该栈中的实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用不管谁激活该 Activity 都会进入同一个应用中。使用场景如闹铃提醒将闹铃提醒与闹铃设置分离。singleInstance不要用于中间页面如果用于中间页面跳转会有问题比如A - B (singleInstance) - C完全退出后在此启动首先打开的是B。 11、View的绘制流程 自定义控件 1、组合控件。这种自定义控件不需要我们自己绘制而是使用原生控件组合成的新控件。如标题栏。 2、继承原有的控件。这种自定义控件在原生控件提供的方法外可以自己添加一些方法。如制作圆角圆形图片。 3、完全自定义控件这个View上所展现的内容全部都是我们自己绘制出来的。比如说制作水波纹进度条。 View的绘制流程OnMeasure()——OnLayout()——OnDraw() 第一步OnMeasure()测量视图大小。从顶层父View到子View递归调用measure方法measure方法又回调OnMeasure。 第二步OnLayout()确定View位置进行页面布局。从顶层父View向子View的递归调用view.layout方法的过程即父View根据上一步measure子View所得到的布局大小和布局参数将子View放在合适的位置上。 第三步OnDraw()绘制视图。ViewRoot创建一个Canvas对象然后调用OnDraw()。六个步骤①、绘制视图的背景②、保存画布的图层Layer③、绘制View的内容④、绘制View子视图如果没有就不用 ⑤、还原图层Layer⑥、绘制滚动条。 12、ViewViewGroup事件分发 \1. Touch事件分发中只有两个主角:ViewGroup和View。ViewGroup包含onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent三个相关事件。View包含dispatchTouchEvent、onTouchEvent两个相关事件。其中ViewGroup又继承于View。 2.ViewGroup和View组成了一个树状结构根节点为Activity内部包含的一个ViwGroup。 3.触摸事件由Action_Down、Action_Move、Aciton_UP组成其中一次完整的触摸事件中Down和Up都只有一个Move有若干个可以为0个。 4.当Acitivty接收到Touch事件时将遍历子View进行Down事件的分发。ViewGroup的遍历可以看成是递归的。分发的目的是为了找到真正要处理本次完整触摸事件的View这个View会在onTouchuEvent结果返回true。 5.当某个子View返回true时会中止Down事件的分发同时在ViewGroup中记录该子View。接下去的Move和Up事件将由该子View直接进行处理。由于子View是保存在ViewGroup中的多层ViewGroup的节点结构时上级ViewGroup保存的会是真实处理事件的View所在的ViewGroup对象:如ViewGroup0-ViewGroup1-TextView的结构中TextView返回了true它将被保存在ViewGroup1中而ViewGroup1也会返回true被保存在ViewGroup0中。当Move和UP事件来时会先从ViewGroup0传递至ViewGroup1再由ViewGroup1传递至TextView。 6.当ViewGroup中所有子View都不捕获Down事件时将触发ViewGroup自身的onTouch事件。触发的方式是调用super.dispatchTouchEvent函数即父类View的dispatchTouchEvent方法。在所有子View都不处理的情况下触发Acitivity的onTouchEvent方法。 7.onInterceptTouchEvent有两个作用1.拦截Down事件的分发。2.中止Up和Move事件向目标View传递使得目标View所在的ViewGroup捕获Up和Move事件。 13、保存Activity状态 onSaveInstanceState(Bundle)会在activity转入后台状态之前被调用也就是onStop()方法之前onPause方法之后被调用 14、Android中的几种动画 帧动画指通过指定每一帧的图片和播放时间有序的进行播放而形成动画效果比如想听的律动条。 补间动画指通过指定View的初始状态、变化时间、方式通过一系列的算法去进行图形变换从而形成动画效果主要有Alpha、Scale、Translate、Rotate四种效果。注意只是在视图层实现了动画效果并没有真正改变View的属性比如滑动列表改变标题栏的透明度。 属性动画在Android3.0的时候才支持通过不断的改变View的属性不断的重绘而形成动画效果。相比于视图动画View的属性是真正改变了。比如view的旋转放大缩小。 15、Android中跨进程通讯的几种方式 Android 跨进程通信像intentcontentProvider,广播service都可以跨进程通信。 intent这种跨进程方式并不是访问内存的形式它需要传递一个uri,比如说打电话。 contentProvider这种形式是使用数据共享的形式进行数据共享。 service远程服务aidl 广播 16、AIDL理解 此处延伸简述Binder AIDL: 每一个进程都有自己的Dalvik VM实例都有自己的一块独立的内存都在自己的内存上存储自己的数据执行着自己的操作都在自己的那片狭小的空间里过完自己的一生。而aidl就类似与两个进程之间的桥梁使得两个进程之间可以进行数据的传输跨进程通信有多种选择比如 BroadcastReceiver , Messenger 等但是 BroadcastReceiver 占用的系统资源比较多如果是频繁的跨进程通信的话显然是不可取的Messenger 进行跨进程通信时请求队列是同步进行的无法并发执行。 Binde机制简单理解: 在Android系统的Binder机制中是有Client,Service,ServiceManager,Binder驱动程序组成的其中ClientserviceService Manager运行在用户空间Binder驱动程序是运行在内核空间的。而Binder就是把这4种组件粘合在一块的粘合剂其中核心的组件就是Binder驱动程序Service Manager提供辅助管理的功能而Client和Service正是在Binder驱动程序和Service Manager提供的基础设施上实现C/S 之间的通信。其中Binder驱动程序提供设备文件/dev/binder与用户控件进行交互 Client、ServiceService Manager通过open和ioctl文件操作相应的方法与Binder驱动程序进行通信。而Client和Service之间的进程间通信是通过Binder驱动程序间接实现的。而Binder Manager是一个守护进程用来管理Service并向Client提供查询Service接口的能力。 17、Handler的原理 Android中主线程是不能进行耗时操作的子线程是不能进行更新UI的。所以就有了handler它的作用就是实现线程之间的通信。 handler整个流程中主要有四个对象handlerMessage,MessageQueue,Looper。当应用创建的时候就会在主线程中创建handler对象 我们通过要传送的消息保存到Message中handler通过调用sendMessage方法将Message发送到MessageQueue中Looper对象就会不断的调用loop()方法 不断的从MessageQueue中取出Message交给handler进行处理。从而实现线程之间的通信。 18、Binder机制原理 在Android系统的Binder机制中是有Client,Service,ServiceManager,Binder驱动程序组成的其中ClientserviceService Manager运行在用户空间Binder驱动程序是运行在内核空间的。而Binder就是把这4种组件粘合在一块的粘合剂其中核心的组件就是Binder驱动程序Service Manager提供辅助管理的功能而Client和Service正是在Binder驱动程序和Service Manager提供的基础设施上实现C/S 之间的通信。其中Binder驱动程序提供设备文件/dev/binder与用户控件进行交互Client、ServiceService Manager通过open和ioctl文件操作相应的方法与Binder驱动程序进行通信。而Client和Service之间的进程间通信是通过Binder驱动程序间接实现的。而Binder Manager是一个守护进程用来管理Service并向Client提供查询Service接口的能力。 19、热修复的原理 我们知道Java虚拟机 —— JVM 是加载类的class文件的而Android虚拟机——Dalvik/ART VM 是加载类的dex文件 而他们加载类的时候都需要ClassLoader,ClassLoader有一个子类BaseDexClassLoader而BaseDexClassLoader下有一个 数组——DexPathList是用来存放dex文件当BaseDexClassLoader通过调用findClass方法时实际上就是遍历数组 找到相应的dex文件找到则直接将它return。而热修复的解决方法就是将新的dex添加到该集合中并且是在旧的dex的前面 所以就会优先被取出来并且return返回。 20、Android内存泄露及管理 1内存溢出OOM和内存泄露对象无法被回收的区别。2引起内存泄露的原因 (3) 内存泄露检测工具 ——→LeakCanary 内存溢出 out of memory是指程序在申请内存时没有足够的内存空间供其使用出现out of memory比如申请了一个integer,但给它存了long才能存下的数那就是内存溢出。内存溢出通俗的讲就是内存不够用。 内存泄露 memory leak是指程序在申请内存后无法释放已申请的内存空间一次内存泄露危害可以忽略但内存泄露堆积后果很严重无论多少内存,迟早会被占光 内存泄露原因 一、Handler 引起的内存泄漏。 解决将Handler声明为静态内部类就不会持有外部类SecondActivity的引用其生命周期就和外部类无关 如果Handler里面需要context的话可以通过弱引用方式引用外部类 二、单例模式引起的内存泄漏。 解决Context是ApplicationContext由于ApplicationContext的生命周期是和app一致的不会导致内存泄漏 三、非静态内部类创建静态实例引起的内存泄漏。 解决把内部类修改为静态的就可以避免内存泄漏了 四、非静态匿名内部类引起的内存泄漏。 解决将匿名内部类设置为静态的。 五、注册/反注册未成对使用引起的内存泄漏。 注册广播接受器、EventBus等记得解绑。 六、资源对象没有关闭引起的内存泄漏。 在这些资源不使用的时候记得调用相应的类似close、destroy、recycler、release等方法释放。 七、集合对象没有及时清理引起的内存泄漏。 通常会把一些对象装入到集合中当不使用的时候一定要记得及时清理集合让相关对象不再被引用。 21、Fragment与Fragment、Activity通信的方式 1.直接在一个Fragment中调用另外一个Fragment中的方法2.使用接口回调3.使用广播4.Fragment直接调用Activity中的public方法 22、Android UI适配 字体使用sp,使用dp多使用match_parentwrap_contentweight 图片资源不同图片的的分辨率放在相应的文件夹下可使用百分比代替。 23、app优化 app优化:(工具Hierarchy Viewer 分析布局 工具TraceView 测试分析耗时的) App启动优化布局优化响应优化内存优化电池使用优化网络优化 App启动优化(针对冷启动) App启动的方式有三种 冷启动App没有启动过或App进程被killed, 系统中不存在该App进程, 此时启动App即为冷启动。 热启动热启动意味着你的App进程只是处于后台, 系统只是将其从后台带到前台, 展示给用户。 介于冷启动和热启动之间, 一般来说在以下两种情况下发生: (1)用户back退出了App, 然后又启动. App进程可能还在运行, 但是activity需要重建。(2)用户退出App后, 系统可能由于内存原因将App杀死, 进程和activity都需要重启, 但是可以在onCreate中将被动杀死锁保存的状态(saved instance state)恢复。 优化 Application的onCreate特别是第三方SDK初始化首屏Activity的渲染都不要进行耗时操作如果有就可以放到子线程或者IntentService中 布局优化 尽量不要过于复杂的嵌套。可以使用 响应优化 Android系统每隔16ms会发出VSYNC信号重绘我们的界面(Activity)。 页面卡顿的原因 (1)过于复杂的布局.(2)UI线程的复杂运算(3)频繁的GC,导致频繁GC有两个原因:1、内存抖动, 即大量的对象被创建又在短时间内马上被释放.2、瞬间产生大量的对象会严重占用内存区域。 内存优化参考内存泄露和内存溢出部分 电池使用优化(使用工具Batterystats bugreport) (1)优化网络请求(2)定位中使用GPS, 请记得及时关闭 网络优化(网络连接对用户的影响:流量,电量,用户等待)可在Android studio下方logcat旁边那个工具Network Monitor检测 API设计App与Server之间的API设计要考虑网络请求的频次, 资源的状态等. 以便App可以以较少的请求来完成业务需求和界面的展示.Gzip压缩使用Gzip来压缩request和response, 减少传输数据量, 从而减少流量消耗.图片的Size可以在获取图片时告知服务器需要的图片的宽高, 以便服务器给出合适的图片, 避免浪费.网络缓存适当的缓存, 既可以让我们的应用看起来更快, 也能避免一些不必要的流量消耗. 24、图片优化 (1)对图片本身进行操作。尽量不要使用setImageBitmap、setImageResource、BitmapFactory.decodeResource来设置一张大图因为这些方法在完成decode后 最终都是通过java层的createBitmap来完成的需要消耗更多内存. (2)图片进行缩放的比例SDK中建议其值是2的指数值,值越大会导致图片不清晰。(3)不用的图片记得调用图片的recycle()方法 25、HybridApp WebView和JS交互 Android与JS通过WebView互相调用方法实际上是 Android去调用JS的代码 \1. 通过WebView的loadUrl(),使用该方法比较简洁方便。但是效率比较低获取返回值比较困难。\2. 通过WebView的evaluateJavascript(),该方法效率高但是4.4以上的版本才支持4.4以下版本不支持。所以建议两者混合使用。 JS去调用Android的代码 \1. 通过WebView的addJavascriptInterface进行对象映射 该方法使用简单仅将Android对象和JS对象映射即可但是存在比较大的漏洞。 漏洞产生原因是当JS拿到Android这个对象后就可以调用这个Android对象中所有的方法包括系统类java.lang.Runtime 类从而进行任意代码执行。 解决方式 (1)Google 在Android 4.2 版本中规定对被调用的函数以 JavascriptInterface进行注解从而避免漏洞攻击。(2)在Android 4.2版本之前采用拦截prompt进行漏洞修复。 \2. 通过 WebViewClient 的shouldOverrideUrlLoading ()方法回调拦截 url 。这种方式的优点不存在方式1的漏洞缺点JS获取Android方法的返回值复杂。(ios主要用的是这个方式) (1)Android通过 WebViewClient 的回调方法shouldOverrideUrlLoading ()拦截 url(2)解析该 url 的协议(3)如果检测到是预先约定好的协议就调用相应方法 \3. 通过 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt方法回调拦截JS对话框alert()、confirm()、prompt 消息 这种方式的优点不存在方式1的漏洞缺点JS获取Android方法的返回值复杂。 26、JAVA GC原理 垃圾收集算法的核心思想是对虚拟机可用内存空间即堆空间中的对象进行识别如果对象正在被引用那么称其为存活对象 反之如果对象不再被引用则为垃圾对象可以回收其占据的空间用于再分配。垃圾收集算法的选择和垃圾收集系统参数的合理调节直接影响着系统性能。 27、ANR ANR全名Application Not Responding, 也就是”应用无响应”. 当操作在一段时间内系统无法处理时, 系统层面会弹出上图那样的ANR对话框. 产生原因 (1)5s内无法响应用户输入事件(例如键盘输入, 触摸屏幕等).(2)BroadcastReceiver在10s内无法结束(3)Service 20s内无法结束低概率 解决方式 (1)不要在主线程中做耗时的操作而应放在子线程中来实现。如onCreate()和onResume()里尽可能少的去做创建操作。(2)应用程序应该避免在BroadcastReceiver里做耗时的操作或计算。(3)避免在Intent Receiver里启动一个Activity因为它会创建一个新的画面并从当前用户正在运行的程序上抢夺焦点。(4)service是运行在主线程的所以在service中做耗时操作必须要放在子线程中。 28、设计模式 此处延伸Double Check的写法被要求写出来。 单例模式分为恶汉式和懒汉式 饿汉式 public class Singleton { private static Singleton instance new Singleton(); public static Singleton getInstance() { return instance ; } } 懒汉式 public class Singleton02 { private static Singleton02 instance; public static Singleton02 getInstance() { if (instance null) { synchronized (Singleton02.class) { if (instance null) { instance new Singleton02(); } } } return instance; } } 29、RxJava 30、MVPMVCMVVM 此处延伸手写mvp例子与mvc之间的区别mvp的优势 MVP模式对应着Model—业务逻辑和实体模型,view—对应着activity负责View的绘制以及与用户交互,Presenter—负责View和Model之间的交互,MVP模式是在MVC模式的基础上将Model与View彻底分离使得项目的耦合性更低在Mvc中项目中的activity对应着mvc中的C—Controllor,而项目中的逻辑处理都是在这个C中处理同时View与Model之间的交互也是也就是说mvc中所有的逻辑交互和用户交互都是放在Controllor中也就是activity中。View和model是可以直接通信的。而MVP模式则是分离的更加彻底分工更加明确Model—业务逻辑和实体模型view—负责与用户交互Presenter 负责完成View于Model间的交互MVP和MVC最大的区别是MVC中是允许Model和View进行交互的而MVP中很明显Model与View之间的交互由Presenter完成。还有一点就是Presenter与View之间的交互是通过接口的 31、手写算法选择冒泡必须要会 32、JNI (1)安装和下载Cygwin下载 Android NDK(2)在ndk项目中JNI接口的设计(3)使用C/C实现本地方法(4)JNI生成动态链接库.so文件(5)将动态链接库复制到java工程在java工程中调用运行java工程即可 33、RecyclerView和ListView的区别 RecyclerView可以完成ListView,GridView的效果还可以完成瀑布流的效果。同时还可以设置列表的滚动方向垂直或者水平 RecyclerView中view的复用不需要开发者自己写代码系统已经帮封装完成了。 RecyclerView可以进行局部刷新。 RecyclerView提供了API来实现item的动画效果。 在性能上 如果需要频繁的刷新数据需要添加动画则RecyclerView有较大的优势。 如果只是作为列表展示则两者区别并不是很大。 34、Universal-ImageLoaderPicassoFrescoGlide对比 Fresco 是 Facebook 推出的开源图片缓存工具主要特点包括两个内存缓存加上 Native 缓存构成了三级缓存 优点 \1. 图片存储在安卓系统的匿名共享内存, 而不是虚拟机的堆内存中, 图片的中间缓冲数据也存放在本地堆内存, 所以, 应用程序有更多的内存使用, 不会因为图片加载而导致oom, 同时也减少垃圾回收器频繁调用回收 Bitmap 导致的界面卡顿, 性能更高。\2. 渐进式加载 JPEG 图片, 支持图片从模糊到清晰加载。\3. 图片可以以任意的中心点显示在 ImageView, 而不仅仅是图片的中心。\4. JPEG 图片改变大小也是在 native 进行的, 不是在虚拟机的堆内存, 同样减少 OOM。\5. 很好的支持 GIF 图片的显示。 缺点: \1. 框架较大, 影响 Apk 体积\2. 使用较繁琐 Universal-ImageLoader估计由于HttpClient被Google放弃作者就放弃维护这个框架 优点 1.支持下载进度监听2.可以在 View 滚动中暂停图片加载通过 PauseOnScrollListener 接口可以在 View 滚动中暂停图片加载。3.默认实现多种内存缓存算法 这几个图片缓存都可以配置缓存算法不过 ImageLoader 默认实现了较多缓存算法如 Size 最大先删除、使用最少先删除、最近最少使用、先进先删除、时间最长先删除等。4.支持本地缓存文件名规则定义 Picasso 优点 \1. 自带统计监控功能。支持图片缓存使用的监控包括缓存命中率、已使用内存大小、节省的流量等。2.支持优先级处理。每次任务调度前会选择优先级高的任务比如 App 页面中 Banner 的优先级高于 Icon 时就很适用。3.支持延迟到图片尺寸计算完成加载4.支持飞行模式、并发线程数根据网络类型而变。 手机切换到飞行模式或网络类型变换时会自动调整线程池最大并发数比如 wifi 最大并发为 44g 为 33g 为 2。 这里 Picasso 根据网络类型来决定最大并发数而不是 CPU 核数。5.“无”本地缓存。无”本地缓存不是说没有本地缓存而是 Picasso 自己没有实现交给了 Square 的另外一个网络库 okhttp 去实现这样的好处是可以通过请求 Response Header 中的 Cache-Control 及 Expired 控制图片的过期时间。 Glide 优点 \1. 不仅仅可以进行图片缓存还可以缓存媒体文件。Glide 不仅是一个图片缓存它支持 Gif、WebP、缩略图。甚至是 Video所以更该当做一个媒体缓存。\2. 支持优先级处理。\3. 与 Activity/Fragment 生命周期一致支持 trimMemory。Glide 对每个 context 都保持一个 RequestManager通过 FragmentTransaction 保持与 Activity/Fragment 生命周期一致并且有对应的 trimMemory 接口实现可供调用。\4. 支持 okhttp、Volley。Glide 默认通过 UrlConnection 获取数据可以配合 okhttp 或是 Volley 使用。实际 ImageLoader、Picasso 也都支持 okhttp、Volley。\5. 内存友好。Glide 的内存缓存有个 active 的设计从内存缓存中取数据时不像一般的实现用 get而是用 remove再将这个缓存数据放到一个 value 为软引用的 activeResources map 中并计数引用数在图片加载完成后进行判断如果引用计数为空则回收掉。内存缓存更小图片Glide 以 url、view_width、view_height、屏幕的分辨率等做为联合 key将处理后的图片缓存在内存缓存中而不是原始图片以节省大小与 Activity/Fragment 生命周期一致支持 trimMemory。图片默认使用默认 RGB_565 而不是 ARGB_888虽然清晰度差些但图片更小也可配置到 ARGB_888。6.Glide 可以通过 signature 或不使用本地缓存支持 url 过期 42、Xutils, OKhttp, Volley, Retrofit对比 Xutils这个框架非常全面可以进行网络请求可以进行图片加载处理可以数据储存还可以对view进行注解使用这个框架非常方便但是缺点也是非常明显的使用这个项目会导致项目对这个框架依赖非常的严重一旦这个框架出现问题那么对项目来说影响非常大的。、 OKhttpAndroid开发中是可以直接使用现成的api进行网络请求的。就是使用HttpClient,HttpUrlConnection进行操作。okhttp针对Java和Android程序封装的一个高性能的http请求库支持同步异步而且okhttp又封装了线程池封装了数据转换封装了参数的使用错误处理等。API使用起来更加的方便。但是我们在项目中使用的时候仍然需要自己在做一层封装这样才能使用的更加的顺手。 **Volley**Volley是Google官方出的一套小而巧的异步请求库该框架封装的扩展性很强支持HttpClient、HttpUrlConnection 甚至支持OkHttp而且Volley里面也封装了ImageLoader所以如果你愿意你甚至不需要使用图片加载框架不过这块功能没有一些专门的图片加载框架强大对于简单的需求可以使用稍复杂点的需求还是需要用到专门的图片加载框架。Volley也有缺陷比如不支持post大数据所以不适合上传文件。不过Volley设计的初衷本身也就是为频繁的、数据量小的网络请求而生。 **Retrofit**Retrofit是Square公司出品的默认基于OkHttp封装的一套RESTful网络请求框架RESTful是目前流行的一套api设计的风格 并不是标准。Retrofit的封装可以说是很强大里面涉及到一堆的设计模式,可以通过注解直接配置请求可以使用不同的http客户端虽然默认是用http 可以使用不同Json Converter 来序列化数据同时提供对RxJava的支持使用Retrofit OkHttp RxJava Dagger2 可以说是目前比较潮的一套框架但是需要有比较高的门槛。 Volley VS OkHttp Volley的优势在于封装的更好而使用OkHttp你需要有足够的能力再进行一次封装。而OkHttp的优势在于性能更高因为 OkHttp基于NIO和Okio 所以性能上要比 Volley更快。IO 和 NIO这两个都是Java中的概念如果我从硬盘读取数据第一种方式就是程序一直等数据读完后才能继续操作这种是最简单的也叫阻塞式IO,还有一种是你读你的,程序接着往下执行等数据处理完你再来通知我然后再处理回调。而第二种就是 NIO 的方式非阻塞式 所以NIO当然要比IO的性能要好了,而 Okio是 Square 公司基于IO和NIO基础上做的一个更简单、高效处理数据流的一个库。理论上如果Volley和OkHttp对比的话更倾向于使用 Volley因为Volley内部同样支持使用OkHttp,这点OkHttp的性能优势就没了 而且 Volley 本身封装的也更易用扩展性更好些。 OkHttp VS Retrofit 毫无疑问Retrofit 默认是基于 OkHttp 而做的封装这点来说没有可比性肯定首选 Retrofit。 Volley VS Retrofit 这两个库都做了不错的封装但Retrofit解耦的更彻底,尤其Retrofit2.0出来Jake对之前1.0设计不合理的地方做了大量重构 职责更细分而且Retrofit默认使用OkHttp,性能上也要比Volley占优势再有如果你的项目如果采用了RxJava 那更该使用 Retrofit 。所以这两个库相比Retrofit更有优势在能掌握两个框架的前提下该优先使用 Retrofit。但是Retrofit门槛要比Volley稍高些要理解他的原理各种用法想彻底搞明白还是需要花些功夫的如果你对它一知半解那还是建议在商业项目使用Volley吧。 Java 1、线程中sleep和wait的区别 (1)这两个方法来自不同的类sleep是来自Threadwait是来自Object(2)sleep方法没有释放锁而wait方法释放了锁。(3)wait,notify,notifyAll只能在同步控制方法或者同步控制块里面使用而sleep可以在任何地方使用。 2、Thread中的start()和run()方法有什么区别 start()方法是用来启动新创建的线程而start()内部调用了run()方法这和直接调用run()方法是不一样的如果直接调用run()方法 则和普通的方法没有什么区别。 3、关键字final和static是怎么使用的。 final: 1、final变量即为常量只能赋值一次。2、final方法不能被子类重写。3、final类不能被继承。 static 1、static变量对于静态变量在内存中只有一个拷贝节省内存JVM只为静态分配一次内存 在加载类的过程中完成静态变量的内存分配可用类名直接访问方便当然也可以通过对象来访问但是这是不推荐的。 2、static代码块 static代码块是类加载时初始化自动执行的。 3、static方法 static方法可以直接通过类名调用任何的实例也都可以调用因此static方法中不能用this和super关键字 不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法)只能访问所属类的静态成员变量和成员方法。 4、String,StringBuffer,StringBuilder区别1、三者在执行速度上StringBuilder StringBuffer String (由于String是常量不可改变拼接时会重新创建新的对象)。2、StringBuffer是线程安全的StringBuilder是线程不安全的。由于StringBuffer有缓冲区 5、Java中重载和重写的区别 1、重载一个类中可以有多个相同方法名的但是参数类型和个数都不一样。这是重载。 2、重写子类继承父类则子类可以通过实现父类中的方法从而新的方法把父类旧的方法覆盖。 6、Http https区别 此处延伸https的实现原理 1、https协议需要到ca申请证书一般免费证书较少因而需要一定费用。2、http是超文本传输协议信息是明文传输https则是具有安全性的ssl加密传输协议。3、http和https使用的是完全不同的连接方式用的端口也不一样前者是80后者是443。4、http的连接很简单是无状态的HTTPS协议是由SSLHTTP协议构建的可进行加密传输、身份认证的网络协议比http协议安全。 https实现原理 1客户使用https的URL访问Web服务器要求与Web服务器建立SSL连接。2Web服务器收到客户端请求后会将网站的证书信息证书中包含公钥传送一份给客户端。3客户端的浏览器与Web服务器开始协商SSL连接的安全等级也就是信息加密的等级。4客户端的浏览器根据双方同意的安全等级建立会话密钥然后利用网站的公钥将会话密钥加密并传送给网站。5Web服务器利用自己的私钥解密出会话密钥。6Web服务器利用会话密钥加密与客户端之间的通信。 7、Http位于TCP/IP模型中的第几层为什么说Http是可靠的数据传输协议 tcp/ip的五层模型 从下到上物理层-数据链路层-网络层-传输层-应用层
http://www.dnsts.com.cn/news/254949.html

相关文章:

  • vivo手机为什么建设网站微信公众平台网页制作
  • 如何做网站软件南宁网站关键字优化
  • 北京高端网站公司哪家好硅藻泥网站怎么做
  • 建论坛网站wordpress头像函数
  • 怎么设计公司的网站模板付费网站怎么破解
  • 定州网站建设公司免费psd图片素材网站
  • 网站已经备案更换主机湖南网站制作
  • 盐城网站建设包括哪些微博seo排名优化
  • 电商网站建设的维护要多少钱用花瓣网站上的图片做游戏行吗
  • 山东网站开发公司网站名查找
  • vr模式的网站建设公司wordpress站点语言
  • 饿了么网站做要多少钱嘉兴网站制作套餐
  • 网站推广优化哪家正规小说网页网站建设
  • 17网站一起做网店不发货一键免费生成网页的网站
  • 大连小型网站建设做编程的 网站有哪些内容
  • 济南网站建设用途装修网站免费设计
  • 校园安全网站建设app上架应用市场需要多少费用
  • 站外推广平台有哪些wordpress插件 二次开放
  • 商城网站建设代理商青海百度关键词seo
  • 网上买保险网站文化建设的重要性和意义
  • 邯郸做网站找谁电影网页设计
  • 咋做网站建设部网站如何登录监理工程师
  • 手机记事本做网站做网站收会员费违法吗
  • 沈阳模板建站定制企业网站源码 一品资源网
  • 工信部备案查询网官网seo博客网站怎么做
  • 济南建站哪家好六年级上册数学优化设计答案
  • 哪些网站可以做平面设计挣钱wordpress菜单栏下拉
  • aspx 网站开发工具徐州市做网站
  • 横店影视城网站建设好口碑自适应网站建设
  • 网络建站招聘新中建设公司招聘网站