xml地图|网站地图|网站标签 [设为首页] [加入收藏]

正规赌博平台

当前位置:网上十大正规赌博平台 > 正规赌博平台 > 结果扎心了,阿里35岁程序员

结果扎心了,阿里35岁程序员

来源:http://www.nb-machinery.com 作者:网上十大正规赌博平台 时间:2019-10-09 23:23

本节将对okhttp中的关键的类和方法进行简单介绍,并梳理出执行的基本流程进行,让大家对源码有一个全局的认识。

近日,一名程序员在互联网社区的吐槽:公司一个应届毕业生,领导安排和我一起做项目,提交的代码有许多不合适的地方,我在没有和他提前沟通的情况下做了部分重构,结果直接喷我,让我不要改他的代码,老哥们,遇到过这种情况吗?

最近就有一位阿里员工在某职场论坛晒出了自己被辞退的经历,这位阿里员工今年35岁,有10年开发经验,过完年第一天上班,就被公司劝退,建议他这个月提离职,而被辞退的理由也是让他没想到,公司给的理由是他年纪较大,这位员工也是很迷茫,不知道接下来该如何维持生计。

Class Call

回顾我们上节中出现的Call对象,这个Call是什么呢?

Call对象其实就是一个准备好执行网络请求的request,是对request进行了封装,支持取消。由于一个Call对象表示的是请求和响应流,因此同一个Call不能执行两次。

图片 1

图片 2

Class Dispatcher

在讲Dispatcher之前我们还是来回顾一下如何我们在执行同步或异步请求,分别是执行了Call的execute()和enqueue()方法。下面我们就来看一下这两个方法的源码。

首先,我们来看一下execute():

@Override public Response execute() throws IOException { synchronized  { if  throw new IllegalStateException("Already Executed"); executed = true; } captureCallStackTrace(); eventListener.callStart; try { client.dispatcher().executed; Response result = getResponseWithInterceptorChain(); if (result == null) throw new IOException("Canceled"); return result; } catch (IOException e) { eventListener.callFailed; throw e; } finally { client.dispatcher().finished; }}

其中client.dispatcher()返回就是Dispatcher对象,跟踪源码我们发现这个Dispatcher其实是client的成员变量。接下来我们再看看enqueue():

@Override public void enqueue(Callback responseCallback) { synchronized  { if  throw new IllegalStateException("Already Executed"); executed = true; } captureCallStackTrace(); eventListener.callStart; client.dispatcher().enqueue(new AsyncCall(responseCallback));}

这里同样使用了client.dispatcher(),看到这里大家就知道了,同步和异步请求其实都是通过这个Dispatcher来完成的。那么我们就来了解一下Dispatcher是什么?

Dispatcher负责okhttp的任务调度,管理同步/异步的请求状态,并维护一个线程池,用于执行请求,是Okhttp的核心类。

对此,网友是如此评论的: 直接说让他自己改,改之前你应该先说,不过应届生也敢喷你,不是后台强,就是情商低;千万别自己改,你应该给他说怎么改,然他自己改,我就是应届生,我领导就这样做的。

现在很多年纪在30岁以上,在大型互联网公司工作的员工都有职业焦虑,一来担心自己由于年纪增大跟不上加班的节奏,二来担心自己被公司辞退,而之所以他们都有这样那样的担心,都是因为自己没有形成自己的核心竞争力,可能很多人都会奇怪,难道作为程序员,自己已经掌握了一门技术就没有核心竞争力了吗?

Method getResponseWithInterceptorChain()

接下来我将带大家了解一下这个关键的方法,顾名思义,这个方法是用于获取请求的Response的。回到上面同步请求execute()方法中,我们可以发现该方法内部就是通过调用这个getResponseWithInterceptorChain()来获取请求的Response。其实异步请求enqueue()方法最终也是通过调用这个方法来获取请求的Response的。这里我带大家了解一下enqueue()方法如何调用这个方法的。回到enqueue()方法中,我们可以发现异步请求是通过client.dispatcher().enqueue(new AsyncCall(responseCallback))来实现的。我们先看一下enqueue()方法中参数new AsyncCall(responseCallback)的源码。

 final class AsyncCall extends NamedRunnable { private final Callback responseCallback; AsyncCall(Callback responseCallback) { super("OkHttp %s", redactedUrl; this.responseCallback = responseCallback; } String host() { return originalRequest.url; } Request request() { return originalRequest; } RealCall get() { return RealCall.this; } @Override protected void execute() { boolean signalledCallback = false; try { Response response = getResponseWithInterceptorChain(); if (retryAndFollowUpInterceptor.isCanceled { signalledCallback = true; responseCallback.onFailure(RealCall.this, new IOException("Canceled")); } else { signalledCallback = true; responseCallback.onResponse(RealCall.this, response); } } catch (IOException e) { if (signalledCallback) { // Do not signal the callback twice! Platform.get().log(INFO, "Callback failure for "   toLoggableString; } else { eventListener.callFailed(RealCall.this, e); responseCallback.onFailure(RealCall.this, e); } } finally { client.dispatcher().finished; } } }

我们发现这个AsyncCall内部类其实是一个Runnable。我们再来看一下Dispatcher的enqueue()方法的源码。

synchronized void enqueue(AsyncCall call) { if (runningAsyncCalls.size() < maxRequests && runningCallsForHost < maxRequestsPerHost) { runningAsyncCalls.add; executorService().execute; } else { readyAsyncCalls.add; } }

我们发现executorService().execute其实就是通过Dispatcher中的线程池来执行这个AsyncCall Runnable的。这样我们再回过头来看看这个AsyncCallexecute ()方法,其实就是在这里调用了getResponseWithInterceptorChain()来获取请求的Response。讲到这里,大家是不是开始对这个getResponseWithInterceptorChain()方法十分好奇了,这个方法是如何获取请求的Response。当然我们还是一起来看一下源码。

 Response getResponseWithInterceptorChain() throws IOException { // Build a full stack of interceptors. List<Interceptor> interceptors = new ArrayList<>(); interceptors.addAll(client.interceptors; interceptors.add(retryAndFollowUpInterceptor); interceptors.add(new BridgeInterceptor(client.cookieJar; interceptors.add(new CacheInterceptor(client.internalCache; interceptors.add(new ConnectInterceptor; if (!forWebSocket) { interceptors.addAll(client.networkInterceptors; } interceptors.add(new CallServerInterceptor(forWebSocket)); Interceptor.Chain chain = new RealInterceptorChain(interceptors, null, null, null, 0, originalRequest, this, eventListener, client.connectTimeoutMillis(), client.readTimeoutMillis(), client.writeTimeoutMillis; return chain.proceed(originalRequest); }

这段代码大家看起来可能会很奇怪,这里怎么出现这么多interceptor,大伙也没看到请求,为啥这里就直接返回了response了。其实,这里采用了责任链模式,来实现最终的请求response。具体如何实现的我会在后面的文章中给大家一一说明,这里就不展开了说。

图片 3

图片 4

本文由网上十大正规赌博平台发布于正规赌博平台,转载请注明出处:结果扎心了,阿里35岁程序员

关键词: www.4355mg.c