2016-11-03 8 views
1

Я пытаюсь получить ответ веб-сервера с помощью OkHttp. Мой текущий minSdkVersion 15.Требуется использовать API-интерфейс уровня API 19 (OkHttp)

Мой код

@Override 
    protected String doInBackground(String... strings) { 

     GetDataFromUrl getData = new GetDataFromUrl(); 
     String response = null; 
     try { 
       response = getData.run(URL); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return response; 
    } 

И

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(); 
     } 
    } 

Я получаю предупреждение на линии try (Response response = client.newCall(request).execute()).

Это говорит "Try-with-resources requires API level 19 (current min is 15).

Я знаю, что если изменить минимальный уровень API до 19, он будет работать нормально. Но я должен поддерживать Минимальный уровень 15 API.

Есть ли решение ?

ответ

5

решение не использовать примерочных с-ресурсов, если вы не можете установить уровень мин API до 19. Таким образом, вместо этого:

try (Response response = client.newCall(request).execute()) { 
    return response.body().string(); 
} 

вы должны к этому:

Response response = null; 
try { 
    response = client.newCall(request).execute(); 
    return response.body().string(); 
} finally { 
    if (response != null) { 
     response.close(); 
    } 
} 

EDIT: Java Language Specification, Section 14.20.3.1 обеспечивает несколько иной (но, в данном случае, функционально идентичны) эквивалентна основной примерочных с-ресурсами оператора (один без каких-либо catch или finally блоков), как у вас есть:

{ 
    final Response response = client.newCall(request).execute(); 
    Throwable primaryExc = null; 

    try { 
     return response.body().string(); 
    } catch (Throwable t) { 
     primaryExc = t; 
     throw t; 
    } finally { 
     if (response != null) { 
      if (primaryExc != null) { 
       try { 
        response.close(); 
       } catch (Throwable suppressed) { 
        primaryExc.addSuppressed(suppressed); 
       } 
      } else { 
       response.close(); 
      } 
     } 
    } 
} 

У этого эффекта есть два эффекта. Во-первых, он делает переменную response локальной эквивалентной. (Мое предложение сделало его видимым после того, как заявление try заканчивается, что может быть нежелательным.) Более важно то, что он имеет эффект подавления любого исключения, брошенного при закрытии ресурса. То есть, если тело исходного блока try выдает исключение, вызывающий код увидит, что вместо исключения, вызванного close(). (Исключение, вызванное close(), по-прежнему будет доступно с помощью метода getSuppressed() исключенного фактического исключения.) Вам не нужна эта более сложная версия, поскольку (насколько я могу судить по документам API) Response.close() не генерирует исключений ,

+0

Спасибо, он работает. :) – Sudarshan

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

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