在服务端返回数据之后,OkHttp 将原始的结果交给 Retrofit,Retrofit根据用户的需求对结果进行解析。...网上一般都推荐RxJava+Retrofit+OkHttp框架,Retrofit负责请求的数据和请求的结果,使用接口的方式呈现, OkHttp负责请求的过程,RxJava负责异步,各种线程之间的切换,...Executor,okhttp 切换线程需要手动操作,但是retrofit // 不需要,就是因为这个Executor 的存在,其实他是handler Executor callbackExecutor...serviceMethod的callAdapter的adapt方法,并传入okHttpCall,返回一个对象, //这个的目的主要是为了适配返回类型,其内部会对OkhttpCall对象进行包装...方法,传入将OkHttpCall对象,callAdapter的目的主要是为了适配 OkHttpCall对象,其内部会对OkHttpCall对象进行包装,生成对应返回类型的对象。
那我先说我的思路,如果是我,我先想摸清需求 需求如下: 1、首先要解耦,请求和构建请求分离,所以必须在这里"库"里面组建一个Call来和okHttp里面的Call对应 2、有返回值的时候给外部调用的回调...再来看下他两个方法的注释 2、看下他的Type responseType()方法的注释 返回此适配器将HTTP响应body转换为Java对象时使用的类型。...老规矩看下他的 ***类**** 的注释,翻译一下就是 基于Retrofit的create方法的返回值创建CallAdapter实例。...当没有指定时,使用下面的默认值: 如果是 Android:回调在应用程序的主(UI)线程上执行,如果是JVM,则在执行请求的后台线程上执行回调。...所以我直接在Retrofit的包下找AndroidPlatform,结果发现没有,我就蒙圈了,后来才发现在Platform的内部类里面,汗.....
、或者启动运行在其他有线程切换能力的上下文的协程)。...换句话说,在例子当中整个 launch 内部你看到的代码都是运行在 UI 线程的,尽管 getUser 在执行的时候确实切换了线程,但返回结果的时候会再次切回来。...这看上去有些费解,因为直觉告诉我们,getUser 返回了一个 Deferred 类型,它的 await 方法会返回一个 User 对象,意味着 await 需要等待请求结果返回才可以继续执行,那么 await...这里 await 就很可疑了,因为它实际上是一个 suspend 函数,这个函数只能在协程体或者其他 suspend 函数内部被调用,它就像是回调的语法糖一样,它通过一个叫 Continuation 的接口的实例来返回结果... response); void onFailure(Call call, Throwable t); } 有结果正常返回的时候,Continuation 调用 resume 返回结果,
、或者启动运行在其他有线程切换能力的上下文的协程)。...换句话说,在例子当中整个 launch 内部你看到的代码都是运行在 UI 线程的,尽管 getUser 在执行的时候确实切换了线程,但返回结果的时候会再次切回来。...这看上去有些费解,因为直觉告诉我们, getUser 返回了一个 Deferred 类型,它的 await 方法会返回一个 User 对象,意味着 await 需要等待请求结果返回才可以继续执行,那么...这里 await 就很可疑了,因为它实际上是一个 suspend 函数,这个函数只能在协程体或者其他 suspend 函数内部被调用,它就像是回调的语法糖一样,它通过一个叫 Continuation 的接口的实例来返回结果... response); void onFailure(Call call, Throwable t); } 有结果正常返回的时候, Continuation 调用 resume 返回结果
关键词:Kotlin 协程 协程取消 任务停止 协程的任务的取消需要靠协程内部调用的协作支持,这就类似于我们线程中断以及对中断状态的响应一样。 1. 线程的中断 我们先从大家熟悉的话题讲起。...线程有一个被废弃的 stop 方法,这个方法会让线程立即死掉,并且释放它持有的锁,这样会让它正在读写的存储处于一个不安全的状态,因此 stop 被废弃了。...我们应该想办法让线程内部正在运行的任务跟我们合作把任务停掉,这样线程内部的任务停止之前还有机会清理一些资源,比如关闭流等等。...,让它把一个叫 bennyhuo 的用户信息返回来,我们知道 OkHttp 的这个 Call是支持 cancel 的, 取消后,网络请求过程中如果读取到这个取消的状态,就会把请求给停止掉。...4.2 如何正确的将回调转换为协程 前面我们提到既然 adapt 方法不是 suspend 方法,那么我们是不是应该在其他位置创建协程呢?
, String> converter = retrofit.stringConverter(type, annotations); //返回ParameterHandler的静态内部类...); // 返回ParameterHandler内部类Part的实例,然后调用的iterable()方法返回一个ParameterHandler对象 return..., methodAnnotations); // 返回ParameterHandler内部类Part的实例,然后调用的array()方法返回一个ParameterHandler...其实就会返回回调的线程池 3.12、newBuilder()方法解析 代码很简单,就是new一个Builder对象并返回 public Builder newBuilder() { return...3、入参的是Retrofit的构造函数,其实就是把Retrofit的属性赋值给Builder 4、相关方法解析 4.1、client方法和callFactory /** * The HTTP
onRebind() 当旧的组件与服务解绑后,另一个新的组件与服务绑定,onUnbind()返回true时,系统将调用此方法。...stopService(Intent)停止该服务 2.bindService ①.创建bindService服务段,继承自service并在类中,创建一个实现binder接口的实例对象并提供公共方法给客户端调用...②.从onbind()回调方法返回此binder实例 ③.在客户端中,从onserviceconnected()回调方法接收binder,并使用提供的方法调用绑定服务 5.Activity的启动方式(...; View调用dispathTouchEvent()方法,然后在OnTouchEvent()进行处理事件;OnTouchEvent() 返回true,表示消耗此事件,不再向下传递;返回false,表示不消耗事件...)设置优先级,否则仍然会降低程序响应,因为默认Thread的优先级和主线程相同 c)使用Handler处理子线程结果,而不是使用Thread.wait()或者Thread.sleep()来阻塞主线程 d
是Retrofit的一个内部类,用来配置一些成员变量,这里配置了baseUrl和ConverterFactory(对象的序列号/反序列化组件),然后创建一个Retrofit对象。...defaultCallbackExecutor:返回的是用于执行 Callback 的 线程池。...可以看到MainThreadExecutor 获取了主线程的 Looper 并构造了一个主线程的 Handler,调用 Callback 时会将该请求 post 到主线程上去执行。...哈哈,这叫动态代理,可以生成接口对应的对象,之后使用这个对象调用方法时都会调用InvocationHandler中的invoke方法。...这里就简单说说ServiceMethod的功能,再讲下去这层次结果有点深... ServiceMethod的定义:把对接口中的方法的调用转化成一次HTTP调用。 (说人话...) 呃...
前言 最近博客的产出确实很少,因为博主我正在写一本Android进阶书籍,两头很难兼顾,但是每个月也得至少发一篇博客。...很简短,查看Platform的get方法,如下所示。 ? Platform的get方法最终调用的是findPlatform方法,根据不同的运行平台来提供不同的线程池。...最终会返回配置好的Retrofit类。 2.Call的创建过程 紧接着我们创建Retrofit实例并调用如下代码来生成接口的动态代理对象: ?...注释1处调用了createCallAdapter方法,它最终会得到我们在构建Retrofit调用build方法时adapterFactories添加的对象的get方法,Retrofit的build方法部分代码...Call的enqueue方法主要做的就是用OKHttp来请求网络并将返回的Response进行数据转换并回调给UI线程。 至此,Retrofit的源码就讲到这里。
Retrofit源码基于最新版本2.9.0 预备 Retrofit使得网络调用可以像RESTful设计风格一样简洁,如: interface WanApi { //用注解标记网络请求方式get、...方法返回类型不能用通配符和void... //2....HttpServiceMethod.parseAnnotations,HttpServiceMethod负责适配和转换处理,将接口方法的调用调整为HTTP调用, //HttpServiceMethod.java...; //如果没设置线程池,则给android平台设置一个默认的MainThreadExecutor(用Handler将回调切回主线程) if (callbackExecutor == null...Call,他的enqueue会使用主线程池的execute return executor == null ?
,今天就给大家带来一款Tamic框架,来模仿下Retrofit的实现原理。...,面向接口编程等,这些技术这里不再重复介绍,retrofit最大的优势就是他的resutFul Api, ,下面接着看重点。...一样的bulid模式的API工厂,此类主要用反射解析和代理ApiService,用来执行具体网络访问请求,动态解析泛型数据模型,回调服务端返回的请求结果,返回上层便于UI更新。...线程池工厂 用来管理和复用线程,避免线程溢出造成内存泄露,不是本次关注的点,略去 ---- 实现好了自己的Retrofit,接下来再看看怎样使用,观察下和Retrofit用法有什么区别?...测试结果 数据成功请求到,并且被框架自动解析返回JavaBean 既然功能和Retrofit很相似,和Retrofit几乎一摸一样,不妨我们再看看的工程配置 : compile 'com.loopj.android
主要是对相关view的获取,销毁等操作 View: view层实现类,主要就是Activity或Fragment,负责UI展示和事件响应 Model: model层实现类,就是依据业务,请求对应接口或数据库,并将结果返给回调...CallBack Persenter: persenter层类,负责业务逻辑处理,view将响应传给persenter,persenter负责调用model,并将结果返回给view供其展示 MVP: MVP...在Activity或Fragment的onDestroy或onStop方法中调用detachView方法解除与view的绑定;而getView方法则是presenter在model返回数据后调用来操作对应...RxJava + Retrofit 形式的时候,Retrofit 把请求封装进 Observable ,在请求结束后调用 onNext() 或在请求失败后调用 onError()。...可以看到,调用了service的login方法后得到Observable对象,在新的线程中执行网络请求,请求成功后切换到io线程执行保存用户信息的动作,最后再切换到主线程执行请求失败onError()、
ExecutorService 线程池,最小0,最大Max的线程池 在执行call.excute()的时候,调用到realcall类里的excute方法,这个是同步方法,在方法的第一行就加了锁,判断executed...发起真正的网络请求,解析返回的数据 http写入网络IO流,从网络IO流中读取返回给客户端的数据。...在服务端返回数据之后,OkHttp将原始的结果交给Retrofit,Retrofit根据用户的需求对结果进行解析。...创建接口实例,调用具体的网络请求 call同步/异步网络请求 处理服务器返回的数据 Retrofit网络通信八步骤 创建Retrofit实例 定义网络请求接口,并为接口中的方法添加注解 通过动态代理生成网络请求对象...通过网络请求适配器将网络请求对象进行平台适配 通过网络请求执行器,发送网络请求(call) 通过数据解析器解析数据 通过回调执行器,切换线程 用户在主线程处理返回结果 代理 为其他对象提供一种代理,用以控制对这个对象的访问
初始化 Retrofit 新建类Api,此类就是初始化Retrofit,提供一个静态方法初始化Retrofit非常简单...., "data":{ "name":"张三" "age":3 } } 如果你们的服务器返回不是这样的格式那你就只有坐下来请他喝茶,跟他好好说(把他头摁进显示器)了。大不了就献出你的菊花吧!...我们要对所以返回结果进行预处理,新建一个RxHelper,预处理无非就是对code进行判断和解析,不同的错误返回不同的错误信息,这还不简单。...然而 onStart()由于在 subscribe()发生时就被调用了,因此不能指定线程,而是只能执行在 subscribe()被调用时的线程。所以onStart并不能保证永远在主线程运行。...千万不要小看了RxJava,与 onStart()相对应的有一个方法 doOnSubscribe(),它和 onStart()同样是在subscribe()调用后而且在事件发送前执行,但区别在于它可以指定线程
POST 这样解释,想必大家就明白了 除了 GET 方法之外 还有一种 POST 方法,相比于使用 GET ,使用 POST 有很多其他的优点,这里就不多说了 他使用和 GET 的思路一样,如果用 POST...(UserMgrService.class); 过于简单,调用前面 retrofit 对象的 create() 方法传入接口的 class 文件即可 获得 Call 对象 由刚开始的代码我们知道 我们向服务器发送请求需要调用...,他返回的直接就是一个 Call 对象 发送请求 请求分两种 同步的和异步的 由于请求是耗时的,假设我们发送同步请求 ,在请求就过返回之前,应用界面会进去阻塞状态 说白了就是会卡,甚至卡死。。。...+ response.body().getUser_head_img()); 具体就不说了,就是调用 call 的 execute() 会返回一个值 这个值就是请求结果,大家直接用就是( 但是在这个只没返回...,直接调用 call 的 enqueue 方法,传入一个 Callback 接口即可 调用后系统自动释放资源,不会阻塞,等到请求结果返回时 就会自动调用 onResponse 方法,方法 里的 response
Header、Url 等信息,之后由 OkHttp 完成后续的请求操作 在服务端返回数据之后,OkHttp 将原始的结果交给 Retrofit,Retrofit根据用户的需求对结果进行解析 2....具体请看:外观模式(Facade Pattern) - 最易懂的设计模式解析 Retrofit对象的外观(门店) = retrofit.create() 通过这一外观方法就可以在内部调用各个方法创建网络请求接口的实例和配置网络请求参数...(策略模式) 对 serviceMethod 对象加入线程切换的操作,便于接收数据后通过Handler从子线程切换到主线程从而对返回数据结果进行处理**(装饰模式)** 最终创建并返回一个OkHttpCall...,最终得到一个Response对象 步骤4:进行线程切换从而在主线程处理返回的数据结果 若使用了RxJava,则直接回调到主线程 异步请求的过程跟同步请求类似,唯一不同之处在于:异步请求会将回调方法交给回调执行器在指定的线程中执行...通过调用ExecutorCallbackCall.enqueue(CallBack)从而调用MainThreadExecutor的execute()通过handler切换到主线程处理返回结果(如显示在Activity
调用同步方法时,会使用应用线程来发送请求; 调用异步方法时会通过 OkHttp 的 Dispatcher 提供的线程来执行请求。...Dispatcher:Dispatcher内部实现了懒加载无边界限制的线程池方式,同时该线程池采用了SynchronousQueue这种阻塞队列。...SynchronousQueue每个插入操作必须等待另一个线程的移除操作,同样任何一个移除操作都等待另一个线程的插入操作。...依赖于okhttp,所以需要集成okhttp API返回的数据为JSON格式,在此我使用的是Gson对返回数据解析 添加权限 由于是网络请求,需要在manifest中添加网络请求的权限 返回结果错误,调用response.errorBody().string();可以得到String类型的请求结果,但再次调用response.errorBody().string();得到的结果为
Observable(被观察者),然后call方法会被自动调用,在call方法内部定义事件的回调的行为。 ...) 方法中,后续迭代下将收到由先前的调用返回下一个状态。...retrofit在重写这个方法的时候做了三件事: 1、先判断了这个方法的类是不是一个Object.class),就直接返回方法原有的返回值。...当然我们只是窥探了Retrofit源码的一部分,他还有更复杂更强大的地方等待我们去探索包括返回值转换工厂,拦截器等,这些都属于比较难的地方,我们需要循序渐进的去学习,当我们一点一点的看透框架的本质之后,...所以总结果一下,关于标配我会这样问:RxJava+Retrofit+OkHttp的内部是如何整合在一起的,还有就是它们如何和数据与业务逻辑层进行整合?
val apiService = retrofit.create(ApiService::class.java) 调用API接口:直接调用API接口的方法发起网络请求。...Retrofit内部使用HTTP客户端来处理网络请求和响应。...使用Retrofit实例的create方法创建API接口的实例。Retrofit会使用动态代理创建一个实现了API接口的对象。 调用API接口的方法发起网络请求。...Retrofit会根据方法的注解信息构建HTTP请求,并使用HTTP客户端发起请求。然后,Retrofit会使用转换器将HTTP响应转换为Kotlin或Java对象,并返回给调用者。...然后,我们创建了一个Retrofit实例,并使用它创建了一个ApiService实例。最后,在协程中调用ApiService的方法发起网络请求,并打印获取到的用户信息。
领取专属 10元无门槛券
手把手带您无忧上云