我都把OkHttp解释的这么明白了,您还不会吗?

 

前言

最近都在学校上课,三天满课,剩下还要课程复习维持绩点,基本上维持周更也已经比较吃力了,不过还是会继续坚持,之后的推文基本上会在周天推,嘻嘻。

在面试中OkHttp作为我们基本属于必用的第三方库来说,也是一个非常重要的考点,所以对其原理的掌握也会让我们的能力得到一定的提升。

OkHttp官网地址:https://square.github.io/okhttp/

基本使用

先一段引入关于OkHttp的使用,这是直接拉取了官网挂着的使用方法。因为在一般的使用过程中,后台可能会通过比较带有的session或者cookie来判断当前用户是否和缓存的用户相同,所以一般一个项目整体使用单例模式来创建OkHttpClient 的对象。

OkHttpClient client = new OkHttpClient();String run(String url) throws IOException {Request request = new Request.Builder().url(url).build();try (Response response = client.newCall(request).execute()) {return response.body().string();}
}

源码解析

OkHttpClient client = new OkHttpClient.Builder().build();
Request request = new Request.Builder().url(url).build();Call call = client.newCall(request);
call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {}
});

这是我们的在okhttp中使用的方法,整个项目的解析将围绕下面5个类进行。

  • OkHttpClient: 全局管理者
  • Request: 请求体
  • Call: 请求发起者
  • Callback: 数据接收通道
  • Response: 响应数据体

OkHttpClient、Request

首先是OkHttpClient和Request。为什么这两个一起讲解呢?因为两个构造方式相同OkHttpClient是一个全局掌控者,Request是一个请求体的封装。

public final class Request {final HttpUrl url; // 路径final String method; // 请求方式final Headers headers; // 请求头final @Nullable RequestBody body; // 请求体final Object tag;
}public class OkHttpClient implements Cloneable, Call.Factory, WebSocket.Factory {final Dispatcher dispatcher; // 分发器final @Nullable Proxy proxy; //代理final List<Protocol> protocols; //协议final List<ConnectionSpec> connectionSpecs; //传输层版本和连接协议final List<Interceptor> interceptors; // 拦截器final List<Interceptor> networkInterceptors; // 网络拦截器final EventListener.Factory eventListenerFactory;final ProxySelector proxySelector; //代理选择final CookieJar cookieJar; //cookiefinal @Nullable Cache cache; //缓存final @Nullable InternalCache internalCache; //内部缓存final SocketFactory socketFactory; //socket 工厂final @Nullable SSLSocketFactory sslSocketFactory; //安全套接层socket 工厂,用于HTTPSfinal @Nullable CertificateChainCleaner certificateChainCleaner;  // 验证确认响应证书 适用 HTTPS 请求连接的主机名。final HostnameVerifier hostnameVerifier; // 主机名字确认final CertificatePinner certificatePinner; // 证书链final Authenticator proxyAuthenticator; // 代理身份验证final Authenticator authenticator; // 本地身份验证final ConnectionPool connectionPool; // 连接池,复用连接final Dns dns; // 域名final boolean followSslRedirects; // 安全套接层重定向final boolean followRedirects; // 本地重定向final boolean retryOnConnectionFailure; // 重试连接失败final int connectTimeout; // 连接超时final int readTimeout; // read 超时final int writeTimeout;  // write 超时final int pingInterval;
}

能看到OkHttpClient的内部元素很多,但是我们很多时间并不会进行直接的使用,是因为他自己已经做了很多层的封装,另外他们这种创建对象的模式又称为建造者设计模式。

internal constructor(okHttpClient: OkHttpClient) : this() {this.dispatcher = okHttpClient.dispatcherthis.connectionPool = okHttpClient.connectionPoolthis.interceptors += okHttpClient.interceptors// 。。。。。}

对建造者设计模式做一个比较通俗的介绍,就是将我们草稿图上的数据应用到真实的场景中去。

val client = OkHttpClient.Builder().build()
// 调用Builder()的builder()函数
// 最后是创建了OkHttpClient对象,我们原本的数据是存储在OkHttpClient的Builder中
fun build(): OkHttpClient = OkHttpClient(this)

但是说了这么久,还是有一个问题啊,我没看到他对数据进行了使用啊??别着急,现在我们进入我们的使用环节了。

Call:任务的执行者

接下来就是Call这个类,根据模版写法,我们知道需要将封装好的Request请求体数据塞入OkHttpClient中返回的就是一个Call。

@Override public Call newCall(Request request) {return RealCall.newRealCall(this, request, false /* for web socket */);
}

通过进入newCall()方法,我们知道返回的数据其实是实现Call的接口一个具体类RealCall,具体操作我们不用知道,我们只用知道返回的一个具体类是什么就可以了,因为往后的操作都是围绕一个具体的东西展开的。在看模版的下一句话call.enqueue(...),进入函数,我们可以看到下述的函数。

  override fun enqueue(responseCallback: Callback) {synchronized(this) {check(!executed) { "Already Executed" }// 一个Call只能进行一次的执行操作executed = true}callStart()client.dispatcher.enqueue(AsyncCall(responseCallback)) // 1 -->}

其他都还好,直接看到上述最后一行代码,因为我们需要将任务发布出去,并且拿到数据,那么自然需要一个分发器了和一个接收回馈数据的通道了,这显然就是我们上文中OkHttpClient中所看到的dispatcher和我们在外部定义好的Callback ==> responseCallback。

internal fun enqueue(call: AsyncCall) {// 使用同步机制对请求数据进行控制synchronized(this) {readyAsyncCalls.add(call)// 个人理解:对同一个host发起多个请求是为了加快查询速度,减少资源浪费// 他会从正在执行运行的Call中先进行查找,再从准备执行的Call中查找if (!call.call.forWebSocket) {val existingCall = findExistingCallWithHost(call.host)if (existingCall != null) call.reuseCallsPerHostFrom(existingCall)}}promoteAndExecute() // 1 ==>}
// 1 ==>
private fun promoteAndExecute(): Boolean {this.assertThreadDoesntHoldLock()val executableCalls = mutableListOf<AsyncCall>()val isRunning: Booleansynchronized(this) {val i = readyAsyncCalls.iterator()// 将准备队列中的数据进行处理while (i.hasNext()) {val asyncCall = i.next()// 正在运行的请求数量不能大于64个if (runningAsyncCalls.size >= this.maxRequests) break // Max capacity.// 可以存在的host数量为5个if (asyncCall.callsPerHost.get() >= this.maxRequestsPerHost) continue // Host max capacity.i.remove()asyncCall.callsPerHost.incrementAndGet()// 将要运行的放入运行队列中executableCalls.add(asyncCall)runningAsyncCalls.add(asyncCall)}// 用于判断当前队列中的是否还有请求正在进行中isRunning = runningCallsCount() > 0}// 对每一个进入了运行队列中的请求进行正式运行for (i in 0 until executableCalls.size) {val asyncCall = executableCalls[i]asyncCall.executeOn(executorService)}return isRunning}

想来对整个的处理过程已经有一个比较详细的讲解了,但是我们还是没有看到数据的返回操作,甚至说具体的运行,不过我们能够注意到一个中途意外冒出的变量executorService,这个变量是从哪里来的呢?

溯源我们能够发现,他在Dispatcher中就已经有过了初始化操作。

@get:JvmName("executorService") val executorService: ExecutorServiceget() {if (executorServiceOrNull == null) {executorServiceOrNull = ThreadPoolExecutor(0, Int.MAX_VALUE, 60, TimeUnit.SECONDS,SynchronousQueue(), threadFactory("$okHttpName Dispatcher", false))}return executorServiceOrNull!!}

一看到要说ThreadPoolExecutor,哦哦哦哦!线程池,但是和什么线程池长得特别像呢?进入已经定义好的Executors类中查找,能够查找到如下的代码段:

public static ExecutorService newCachedThreadPool() {return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());}

是不是有点像呢?那好,我们就认定了它是我们的CachedThreadPool线程池。

ok!fine!用的线程池来进行异步操作,那肯定就是说明里面有一个线程了,那这个线程是啥,我们是否心里有点数呢?如果没有,也没啥关系,下面我们将继续引出。

fun executeOn(executorService: ExecutorService) {client.dispatcher.assertThreadDoesntHoldLock()var success = falsetry {executorService.execute(this) // (1)success = true} catch (e: RejectedExecutionException) {val ioException = InterruptedIOException("executor rejected")ioException.initCause(e)noMoreExchanges(ioException)responseCallback.onFailure(this@RealCall, ioException) // (2)} finally {if (!success) {client.dispatcher.finished(this) // (3)}}}

那接下来就又不是什么大问题了,主要就看到我们的注释1、2、3。

  1. executorService.execute(this):对于线程池而言运行的显然是线程,而this就是我们的AsyncCall,通过对AsyncCall的观察我们也是能够得知它是继承了Runnable的,所以异步进行的操作来源我们也已经清楚了。
  2. responseCallback.onFailure(),也就是通过我们传入的Callback接收数据的错误反馈。
  3. client.dispatcher.finished(this):为什么需要这个呢?其实他原本有这样的一段英文注释,This call is no longer running!,也就是说明这个函数是为了通知Dispatcher我们的AsyncCall已经完成了运行。

又开始有问题了吧,看着就着急。咋就没看到responseCallback()的onResponse方法的使用呢???

那我们做一个猜测吧,其实我看了一下基本也是正解了。我们的不是Runnable嘛,而数据是放在线程池中run()来运行的,那么onResponse()方法的出现应该是在run()的这个函数中了。接下来我们继续收看代码

override fun run() {threadName("OkHttp ${redactedUrl()}") {var signalledCallback = falsetimeout.enter()try {val response = getResponseWithInterceptorChain() // (1)signalledCallback = trueresponseCallback.onResponse(this@RealCall, response) //(2)} catch (e: IOException) {// 。。。。。responseCallback.onFailure(this@RealCall, e)} catch (t: Throwable) {// 。。。。。responseCallback.onFailure(this@RealCall, e)} finally {client.dispatcher.finished(this)}}}

在这里的注释(2)中,我们很幸运的看到了onResponse()的方法调用了。好那接下来就是下一个问题了,Response是从哪里来的????

我都把OkHttp解释的这么明白了,您还不会吗?

 

Response的诞生

上面不是写着嘛??getResponseWithInterceptorChain()这个函数里来的呗。哇哦!!没错了,那它是怎么来的?

又要看代码了,好烦好烦。。。

internal fun getResponseWithInterceptorChain(): Response {// Build a full stack of interceptors.val interceptors = mutableListOf<Interceptor>()// 对应着我们刚开始自定义的拦截器interceptors += client.interceptorsinterceptors += RetryAndFollowUpInterceptor(client)interceptors += BridgeInterceptor(client.cookieJar)interceptors += CacheInterceptor(client.cache)interceptors += ConnectInterceptor// 我们之前上面也出现过forWebSocket这个flag// 其实它是okhttp为了长连接而准备的if (!forWebSocket) {interceptors += client.networkInterceptors}interceptors += CallServerInterceptor(forWebSocket)val chain = RealInterceptorChain(call = this,interceptors = interceptors,index = 0,exchange = null,request = originalRequest,connectTimeoutMillis = client.connectTimeoutMillis,readTimeoutMillis = client.readTimeoutMillis,writeTimeoutMillis = client.writeTimeoutMillis)val response = chain.proceed(originalRequest)return response}

为了尽量让代码简洁明了,我截取了一些关键代码,以供参考。

其实他就是通过一堆的拦截器来获取数据的,但是显然这里不是终点站,因为我们看到的return中就还是一个函数,说明答案还在这个函数中。通过观察我们很容易得知,这个的操作的具体类是一个叫做RealInterceptorChain的类。

override fun proceed(request: Request): Response {// 不断调用下一个拦截器对相应的数据进行返回val next = copy(index = index + 1, request = request)val interceptor = interceptors[index]val response = interceptor.intercept(next)return response}

我都把OkHttp解释的这么明白了,您还不会吗?

 

如图所示,哪个拦截器能拦截成功,就会返回我们需要的数据Response,当然这个数据你需要注意,并不一定是成功的数据,一般来说数据成功的获取都需要走到我们的响应拦截器之后才能真正的成功。

CacheInterceptor缓存拦截器的源码解读

这里我们需要重点讲解一下CacheInterceptor这个类,我们截取他的intercept()方法,因为里面涉及了我们面试时可能会频繁使用的响应码

override fun intercept(chain: Interceptor.Chain): Response {// 依据我们传入的request得到cache中缓存的responseval cacheCandidate = cache?.get(chain.request())val now = System.currentTimeMillis()// 获取当前的这个请求是网络请求、数据缓存的状况val strategy = CacheStrategy.Factory(now, chain.request(), cacheCandidate).compute()val networkRequest = strategy.networkRequestval cacheResponse = strategy.cacheResponsecache?.trackResponse(strategy)if (cacheCandidate != null && cacheResponse == null) {// The cache candidate wasn't applicable. Close it.cacheCandidate.body?.closeQuietly()}// 本地查询到的网络请求和缓存数据皆为空的情况下// 爆HTTP_GATEWAY_TIMEOUT,网关超时的错误if (networkRequest == null && cacheResponse == null) {return Response.Builder().request(chain.request()).protocol(Protocol.HTTP_1_1).code(HTTP_GATEWAY_TIMEOUT).message("Unsatisfiable Request (only-if-cached)").body(EMPTY_RESPONSE).sentRequestAtMillis(-1L).receivedResponseAtMillis(System.currentTimeMillis()).build()}// 没有网络情况下,直接使用我们本地的数据缓存if (networkRequest == null) {return cacheResponse!!.newBuilder().cacheResponse(stripBody(cacheResponse)).build()}// 调动责任链中下一轮的拦截器,来获取数据var networkResponse: Response? = nulltry {networkResponse = chain.proceed(networkRequest)} finally {// If we're crashing on I/O or otherwise, don't leak the cache body.if (networkResponse == null && cacheCandidate != null) {cacheCandidate.body?.closeQuietly()}}// 观察我们本地是否存在数据缓存if (cacheResponse != null) {// HTTP_NOT_MODIFIED:304,说明我们本地的缓存是最新的// 没有必要将数据从服务器拉取进行更新了if (networkResponse?.code == HTTP_NOT_MODIFIED) {val response = cacheResponse.newBuilder().headers(combine(cacheResponse.headers, networkResponse.headers)).sentRequestAtMillis(networkResponse.sentRequestAtMillis).receivedResponseAtMillis(networkResponse.receivedResponseAtMillis).cacheResponse(stripBody(cacheResponse)).networkResponse(stripBody(networkResponse)).build()networkResponse.body!!.close()// Update the cache after combining headers but before stripping the// Content-Encoding header (as performed by initContentStream()).cache!!.trackConditionalCacheHit()cache.update(cacheResponse, response)return response} else {cacheResponse.body?.closeQuietly()}}val response = networkResponse!!.newBuilder().cacheResponse(stripBody(cacheResponse)).networkResponse(stripBody(networkResponse)).build()// 更新我们本地的缓存数据if (cache != null) {if (response.promisesBody() && CacheStrategy.isCacheable(response, networkRequest)) {// Offer this request to the cache.val cacheRequest = cache.put(response)return cacheWritingResponse(cacheRequest, response)}if (HttpMethod.invalidatesCache(networkRequest.method)) {try {cache.remove(networkRequest)} catch (_: IOException) {// The cache cannot be written.}}}return response}

总结

最后我们通过一张图来完成对整个OkHttp的工作流程梳理。

 

我都把OkHttp解释的这么明白了,您还不会吗?

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 面经集合

    1、说一下操作指令,怎么看cpu,看进程,看端口 查看cpu信息 #cat 查看CPU使用率、内存使用率、磁盘使用率 top vmstat sar free df 查看进程 top ps pgrep 查看端口 lsof -i:端口号 netstat -tunlp |grep 端口号 netstat - atulnp 2、操作系统进程间的通信 原文链接 进程…...

    2024/3/14 4:48:40
  2. 太厉害了2020年终于有人把Spring Cloud 微服务说明白了,史上最权威PDF

    近年来,Spring Cloud 俨然已经成为微服务开发的主流技术栈,在国内开发者社区非常火爆。基于我长期以来在一线互联网公司(携程,拍拍贷等)开展微服务架构的实践经验以及平时对 Spring Cloud 的调研,我认为 Spring Cloud 技术栈中的一部分组件离生产级开发尚有一定距离。比方…...

    2024/4/15 7:37:58
  3. 大家都在想了解的人脸识别算法有名气是哪几家在这

    如今人脸识别已应用到各个行业,从公司,学校,小区门禁,都应用到人脸识别技术,那么人脸识别算法有哪几家比较出名了,现在来科谱一下。人脸识别算法一、云从科技 云从科技团队成员除了来自中科大的校友外,还来自中国科学院各大研究所、UIUC、IBM、NEC、MicroSoft等全球顶尖…...

    2024/4/15 7:37:48
  4. Python 06

    person = 小张 address = 陕西省西安市 phone = 123-4567-8910print(订单的收件人是:+person+收货地是:+address+联系方式是:+phone) #+号产生问题---->很容易犯错 print(订单的收件人是:%s,收货地址是:%s,联系方式是%s % (person,address,phone)) #%s--->占位符---->…...

    2024/4/15 7:37:47
  5. 简述冒泡排序

    初学编程的小白来说,当学到数组和循环后,我们都会接触到排序算法的概念。排序算法常用的有10种,下面我就简单的描述一下冒泡排序这种简单容易理解的算法。冒泡排序属于比较算法,是稳定的算法,选择算法是不稳定的算法。冒泡排序是一种极其简单的排序算法,它重复地遍历过要…...

    2024/4/16 17:55:42
  6. 原型和原型链

    什么是原型? 在JavaScript中,每当定义一个函数数据类型(普通函数、类)时候,都会天生自带一个prototype属性,这个属性指向函数的原型对象,并且这个属性是一个对象数据类型的值。 原型对象就相当于一个公共的区域,所有同一个类的实例都可以访问到这个原型对象,我们可以将对…...

    2024/4/15 7:37:45
  7. mac系统安装win虚拟机超细节教程+软件包

    mac如何安装win的虚拟机 第一步先下载软件 下载Parallels_Desktop苹果虚拟机 下载好之后进行安装软件选择箭头的选项双击开启命令窗口命令窗口下选择回车双击安装选项进行开始安装跳过版本或者新版本同上开始进行安装这个过程可能会比较缓慢等待加载如果是第一次安装的 可能会台…...

    2024/4/15 7:37:46
  8. Flask项目实战——6—(前台用户模型、前台登录注册、图形验证码、手机短信验证码、添加表单验证短信验证码请求)

    1、前台用户模型 前台用户模型定义 创建前台模型文件 apps/front/models.py # -*- encoding: utf-8 -*- """ @File : models.py @Time : 2020/5/11 10:00 @Author : chen 前台模型文件 apps/front/models.py """ # 前台管理的模型 from e…...

    2024/4/15 7:37:43
  9. 广播通信设计——WinSock编程

    广播通信设计 一、设计要求设计要求是通过学习winSock API编程,实现局域网消息广播的应用程序。 系统采用CS架构的方式,具有服务端和客户端。完成的功能有私聊、群聊和私聊时的文件传输,私聊和文件传输采用TCP协议,群聊采用UDP协议。服务端只作为私聊信息的记录和转发,以及…...

    2024/4/15 7:37:42
  10. 【测试】如何测试一个用户登录界面?

    在面试时种类型的题也会时常会被问到。如果面试时遇到这类题,千万不要慌哦,首先,可以询问面试官具体的需求是什么,例如这个登录界面应该是弹出窗口还是嵌在网页里,对用户名的长度,字符格式,密码的强度等。对用户登录界面的美观是否有要求。一、功能测试什么都不输入,点…...

    2024/4/15 7:37:41
  11. git 详解及 git 工具的使用

    git 详解及 git 工具的使用一、版本控制系统简介本地版本控制系统集中式版本控制系统分布式版本控制系统二、git简介Git特点Git状态三、git安装四、git使用 一、版本控制系统简介 版本控制系统(VCS)是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。使…...

    2024/4/15 7:37:40
  12. ftp上传,怎么使用ftp上传文件

    FTP 就是连接「本地」和「空间」的传输桥梁,可以从空间服务器中「下载拷贝」文件到本地电脑,或从本地电脑「上传拷贝」文件到空间服务器上。下面小编分享使用工具上传文件 的教程:打开:IIS7服务器管理工具第一步:点击主程序图中“上传下载”键;第二步:点击“ Ftp”;第三…...

    2024/4/15 7:37:39
  13. Java集合框架综述

    转载自品略图书馆 http://www.pinlue.com/article/2020/05/2213/1110586345333.html一、集合框架图简化图:说明:对于以上的框架图有如下几点说明1、所有集合类都位于java.util包下。Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根…...

    2024/4/15 7:37:40
  14. OpenCV(九)—————图像通道合并与分离(C++)

    将一张图像分别分成三个通道的图像.使用split()函数,分离之后的数据存到一个Mat对象的容器中.#include <opencv2/opencv.hpp> #include <iostream>using namespace cv; using namespace std;int main(int argc,char** argv) {// 读入图像Mat src = imread(".…...

    2024/4/6 22:03:17
  15. python 04

    转义字符: \n 换行 \t 制表符 \ \" \r 回车 IDE中无法实现print() print(小张说:\想吃冰淇淋!!\) #转义字符,单不套单 print("小张说:想玩恐龙!!") #双套单 print(小张说:"想玩恐龙!!") #单套双 #支持双单引号嵌套 print(\哈哈…...

    2024/3/14 4:48:30
  16. LaTeX安装环境和软件下载地址

    LaTeX安装环境和软件下载地址 请根据自己的系统,选择软件进行下载 windows先安装1 texlive2020.iso: https://545c.com/file/23575431-444388655 windows后安装2 texstudio-2.12.22-win-qt5.exe: https://545c.com/file/23575431-444388972 苹果先安装1 https://545c.com/file…...

    2024/3/13 19:28:37
  17. 【Java】字符串String(空字符的比较、字符串的对象的个数、字符串拼接结果)

    字符串String 文章目录字符串String1 、空字符的比较2、 字符串的对象的个数3、 字符串拼接结果4、参考资料 1 、空字符的比较 1、哪些是空字符串 String str1 = ""; String str2 = new String(); String str3 = new String("");空字符串:长度为0 哪些是空…...

    2024/3/14 4:48:28
  18. array_slice和array_splice

    array_slice类似于substr返回子串 array_splice移除子元素并且用新元素替代...

    2024/3/14 4:48:36
  19. 如何在jupyter中访问创建的虚拟环境

    引言 在我们日常工作做,配置环境是十分繁琐的问题。尤其当你来了一个新项目,如果盲目地直接用到你自己的环境中,很容易造成环境的依赖的错位,让你原有的项目都跑步起来!创建虚拟环境 我是一个重度以来Python学习办公的人,这边以Conda为例: 创建环境命令: conda create …...

    2024/3/14 4:48:27
  20. 实现中文汉字金额转换为阿拉伯数字金额(Java方式实现)

    不多说上代码,亲测有效,本人公司项目使用了该工具类,目前没发现什么问题。package com.rock.util;import java.math.BigDecimal;/*** 大写汉字转为阿拉伯数字* @author gyd**/ public class ChineseChangeToNumber {/*** 中文简体*/public static final String[] RMB_NUMBER…...

    2024/3/14 4:48:27

最新文章

  1. MySQL命令分类与大纲

    一、数据库管理 创建与删除数据库 CREATE DATABASE&#xff1a;创建新数据库DROP DATABASE&#xff1a;删除已存在的数据库ALTER DATABASE&#xff1a;修改数据库属性 切换与查看数据库 USE&#xff1a;选择当前工作数据库SHOW DATABASES&#xff1a;列出所有可用数据库 二、…...

    2024/4/16 20:41:08
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. Mac OS X系统中的隐藏文件夹 .fseventsd,.Spotlight-V100,.Trashes

    Mac OS X系统中的隐藏文件夹&#xff08;.fseventsd&#xff0c;.Spotlight-V100&#xff0c;.Trashes&#xff09;&#xff0c;务必谨慎操作。这些文件夹通常存储着系统的临时数据和缓存&#xff0c;对系统的正常运行至关重要。下面是对它们的说明以及如何处理的建议&#xff…...

    2024/4/12 14:25:44
  4. Android Framework学习笔记(2)----系统启动

    Android系统的启动流程 启动过程中&#xff0c;用户可控部分是framework的init流程。init是系统中的第一个进程&#xff0c;其它进程都是它的子进程。 启动逻辑源码参照&#xff1a;system/core/init/main.cpp 关键调用顺序&#xff1a;main->FirstStageMain->SetupSel…...

    2024/4/16 16:53:08
  5. 【Redis】安装Redis后报ERR Client sent AUTH, but no password is set

    一、问题描述 安装Redis后使用auth验证是否安装成功&#xff08;或者其它应用访问redis时报错&#xff09;&#xff0c;报ERR Client sent AUTH, but no password is set 127.0.0.1:6379> auth 123456 (error) ERR Client sent AUTH, but no password is set二、问题解决 …...

    2024/4/13 17:35:26
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/16 14:09:00
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/16 20:21:35
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/15 9:18:15
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/16 1:57:15
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/15 9:17:51
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/15 9:17:44
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/15 13:52:20
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/16 1:58:32
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/16 20:03:42
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/15 9:17:21
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/15 9:17:15
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/15 13:53:08
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/15 9:16:52
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/15 13:53:31
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/16 20:03:44
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/15 9:16:31
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/15 13:54:27
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/15 23:28:22
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/15 23:28:30
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/15 13:54:53
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57