retrofit 异步流程

直接上码:
 

public void retrofit(View view) {
		Retrofit retrofit = new Retrofit.Builder()
				 .baseUrl(BASEURL)
				 .build();
		HttpService httpService = retrofit.create(HttpService.class);
		httpService.get().enqueue(new retrofit2.Callback<ResponseBody>() {
			@Override
			public void onResponse(retrofit2.Call<ResponseBody> call, retrofit2.Response
					<ResponseBody> response) {
				Log.e(TAG, "onResponse: "+response.body().toString());
			}

			@Override
			public void onFailure(retrofit2.Call<ResponseBody> call, Throwable t) {
				Log.e(TAG, "onFailure: "+t.getMessage());
			}
		});
	}

流程:
1.retrofit创建没必要说的,很简单.
2.retrofit.create(... )会创建一个代理对象并实现invoke方法返回,
3.调用get()方法 invoke(...)会触发执行,
4.查看get()方法是否有缓存,有直接读取返回,没有重新解析,找到合适CallAdapter,Converter并缓存,没有找到抛异常
5.然后创建OkHttpCall对象 ,并使用已经分配的好CallAdapter适配OkHttpCall返回(都在invoke 方法中)
6.执行httpService.enqueque(...) :

   默认使用的是ExecutorCallAdapterFactory.ExecutorCallBackCall:
     

 @Override public void enqueue(final Callback<T> callback) {
      checkNotNull(callback, "callback == null");
//这里delegate是在invoke()创建OkHttpCall 实例   
 delegate.enqueue(new Callback<T>() {
    @Override public void onResponse(Call<T> call, final Response<T> response) {
          callbackExecutor.execute(new Runnable() {  //当成功回调会将你的回调分派到ui线程中
            @Override public void run() {
              if (delegate.isCanceled()) {
                // Emulate OkHttp's behavior of throwing/delivering an IOException on cancellation.
//当请求取消将你的回调失败方法
                callback.onFailure(ExecutorCallbackCall.this, new IOException("Canceled"));
              } else {
                callback.onResponse(ExecutorCallbackCall.this, response);
              }
            }
          });
        }

        @Override public void onFailure(Call<T> call, final Throwable t) {
          callbackExecutor.execute(new Runnable() {
            @Override public void run() {
              callback.onFailure(ExecutorCallbackCall.this, t);
            }
          });
        }
      });


7.执行OkHttpCall.enqueque(.....):  
   

@Override public void enqueue(final Callback<T> callback) {
    checkNotNull(callback, "callback == null");

    okhttp3.Call call;
    Throwable failure;

    synchronized (this) {
      if (executed) throw new IllegalStateException("Already executed.");
      executed = true;

      call = rawCall;
      failure = creationFailure;
      if (call == null && failure == null) {
        try {
          call = rawCall = createRawCall();//为空通过已有的参数创建RealCall 
        } catch (Throwable t) {
          failure = creationFailure = t;
        }
      }
    }

    if (failure != null) {
      callback.onFailure(this, failure);
      return;
    }

    if (canceled) {
      call.cancel();
    }
   //然后交给RealCall.enqueque(...) 方法
    call.enqueue(new okhttp3.Callback() {
      @Override public void onResponse(okhttp3.Call call, okhttp3.Response rawResponse)
          throws IOException {
        Response<T> response;
        try {
 //使用已经分配好Converter 解析ResponseBody
 response = parseResponse(rawResponse);
        } catch (Throwable e) {
          callFailure(e);
          return;
        }
        callSuccess(response);
      }

      @Override public void onFailure(okhttp3.Call call, IOException e) {
        try {
          callback.onFailure(OkHttpCall.this, e);
        } catch (Throwable t) {
          t.printStackTrace();
        }
      }

      private void callFailure(Throwable e) {
        try {
          callback.onFailure(OkHttpCall.this, e);
//然后执行ExecutorCallBackCall回调(他自己创建的),并把你创建的回调分发到UI线程执行
        } catch (Throwable t) {
          t.printStackTrace();
        }
      }

      private void callSuccess(Response<T> response) {
        try {
          callback.onResponse(OkHttpCall.this, response);//然后执行ExecutorCallBackCall回调(他自己创建的),并把你创建的回调分发到UI线程执行
        } catch (Throwable t) {
          t.printStackTrace();
        }
      }
    });
  }

 


 真正网络enqueque(...)方法好深诶...越好用封装的越厉害
8.在你创建的回调方法,做出见不得人的事.............................

 

 

图:

  同步流程差不多,只少了线程分派

    ps:用我自己例子来画的,不对的地方望指正

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Retrofit是一个基于OkHttp的RESTful API库,可以方便地调用网络接口。下面是一个简单的示例,展示如何使用Retrofit调用接口。 首先,需要在项目中添加Retrofit的依赖项。可以在build.gradle文件中添加以下代码: ``` implementation 'com.squareup.retrofit2:retrofit:2.9.0' ``` 接下来,需要定义一个接口,用于描述要调用的API。这个接口需要使用注解来描述请求的方式、URL和请求参数等信息。例如: ``` public interface MyApi { @GET("users/{userId}/repos") Call<List<Repo>> listRepos(@Path("userId") String userId); } ``` 这个接口定义了一个名为listRepos的方法,该方法使用GET请求,URL为/users/{userId}/repos,其中{userId}是一个路径参数。该方法返回一个Call对象,表示异步调用API并返回一个List<Repo>对象。 接下来,需要创建一个Retrofit实例,并使用该实例创建一个API对象。例如: ``` Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.github.com/") .build(); MyApi myApi = retrofit.create(MyApi.class); ``` 这里创建了一个基础URL为https://api.github.com/的Retrofit实例,并使用它创建了一个MyApi对象。 最后,可以调用API方法并处理响应。例如: ``` Call<List<Repo>> call = myApi.listRepos("octocat"); call.enqueue(new Callback<List<Repo>>() { @Override public void onResponse(Call<List<Repo>> call, Response<List<Repo>> response) { List<Repo> repos = response.body(); // 处理响应数据 } @Override public void onFailure(Call<List<Repo>> call, Throwable t) { // 处理请求失败 } }); ``` 这里使用listRepos方法异步调用API,并在响应时处理返回的数据。如果请求失败,则调用onFailure方法。 这就是使用Retrofit调用接口的基本流程。通过定义API接口并使用Retrofit创建API对象,可以方便地调用网络接口并处理响应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值