2016-07-13 3 views
0

Я пытаюсь использовать okhttp (3.4.1) для реализации клиента на основе HTTP 2.0. Часть моего требования заключается в реализации нескольких асинхронных HTTP-запросов на разные URL-адреса с обратным вызовом для обработки ответа позднее. Однако, с моей текущей реализацией, я вижу, что я не могу заставить все мои асинхронные запросы использовать одно и то же TCP-соединение, если только я не сделаю блокирующий HTTP-запрос из моего основного потока в начале. Я понимаю, что метод enque(), используемый для асинхронных вызовов, включает диспетчера, который, кажется, порождает новый поток для каждого из запросов. Вот мой фрагмент кода:Создание нескольких асинхронных запросов HTTP 2.0 с okhttp3

OkHttpClient client = new OkHttpClient(); 

Мой асинхронной Get Request метод выглядит следующим образом:

public void AsyncGet(String url) throws Exception { 

    Request request = new Request.Builder().url(url).build(); 

    Call call = client.newCall(request); 

    call.enqueue(new Callback() { 
     @Override 
     public void onFailure(Call call, IOException e) { 
      e.printStackTrace(); 
     } 

     @Override 
     public void onResponse(Call call, Response response) throws IOException { 
      if (!response.isSuccessful()) { 
       throw new IOException("Unexpected code " + response); 
      } 
      new Thread() { 
       @Override 
       public void run() { 
        /* Some code */ 
       } 
      }.start(); 
     } 
    }); 

} 

Мой синхронное Получить запрос выглядит следующим образом:

public Response SyncGet(String url) throws Exception { 

    Request request = new Request.Builder().url(url).build(); 

    Call call = client.newCall(request); 
    Response response = call.execute(); 

    if (!response.isSuccessful()) { 
     throw new IOException("Unexpected code " + response); 
    } 

    return response; 
} 

Посылка последовательность вызовов, как следующие триггеры 2 TCP-соединения с сервером.

AsyncGet(Url); 
AsyncGet(Url2); 

Однако последовательность вызовов, такая как следующая, использует одно и то же соединение TCP.

SyncGet(Url); 
AsyncGet(Url); 
AsyncGet(Url2); 

Я не отлажена это, но, похоже, OkHttp заставляет нас сделать запрос на блокирование HTTP на главном потоке первых, чтобы, возможно, получить контекст соединения TCP, а затем поделиться этим с другими потоками? Или я чего-то не хватает?

+0

Похоже, тот же вопрос, как http://stackoverflow.com/questions/32625035/when-using-http2-in-okhttp-why-multi-requests-to-the-same-host-didnt- use-just – vijaygos

ответ

0

HI вы можете вызвать асинхронный вызов и задать сектор для каждого вызова позже, в зависимости от сектора, который вы можете отличить ответ вызова. попробуйте ниже этого кода надеюсь, что это поможет U

  • клеть отдельный класс для апи вызова

    общественного класса RestApi {

    protected RestApiResponse serverResponse; 
    protected Context c; 
    
    public RestApi(RestApiResponse serverResponse, Context c) { 
        this.serverResponse = serverResponse; 
        this.c = c; 
    } 
    
    public void postDataWithoutAuth(String url,String sector) { 
    
    
        OkHttpClient client = new OkHttpClient(); 
    
        Request request = new Request.Builder() 
    .url("http://publicobject.com/helloworld.txt") 
    .build(); 
    
        client.newCall(request).enqueue(new Callback() { 
         @Override 
         public void onFailure(Call call, IOException e) { 
          Log.e("response", call.request().body().toString()); 
          serverResponse.onErrorLoaded(call.request().body().toString(), sector); 
         } 
    
         @Override 
         public void onResponse(Call call, Response response) throws IOException { 
          serverResponse.onResponseLoaded(response, sector); 
         } 
    
    
        }); 
    } 
    

    }

  • Затем клеть интерфейс для обратного вызова

открытый интерфейс RestApiResponse {

public void onResponseLoaded(Response response, String sector); 

public void onErrorLoaded(String response, String sector); 

}

  • и доступ как это от активности

    RestApi apicall = новый RestApi (это, getBaseContext()); apicall.postDataWithoutAuthUrlEncoded ("ur url", "your sector");

+0

Благодарим вас за ответ. Я должен добавить, что я не разрабатываю свой прототип для Android. Это предназначено для чистого настольного приложения с okhttp.Для меня это похоже, что в текущем диспетчерском модуле okhttp в настоящее время, как представляется, не хватает этой функции (если мы не создадим хак, как тот, который упоминается в моем вопросе). – vijaygos

 Смежные вопросы

  • Нет связанных вопросов^_^