2016-02-24 2 views
2

Я просто хочу использовать okhttp для загрузки некоторых байтов данных, но до того, как я закончил код, я столкнулся с проблемой, что в андроид-студии сообщается об ошибке, которая сказал, что «Request (okhttp3.Request.Builder) имеет частный доступ в okhttp3.Request», мой код проревел, как я могу это исправить?Запрос (okhttp3.Request.Builder) имеет личный доступ в okhttp3.Request

import okhttp3.OkHttpClient; 
import okhttp3.Request; 
import okhttp3.Response; 

public byte[] getUrlBytes(String urlSpec) throws IOException{ 
    URL url = new URL(urlSpec); 

    OkHttpClient client = new OkHttpClient(); 

    try { 

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

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

    } finally { 

    } 

Вот лишь некоторые из моего кода, я просто последовал примеру на http://square.github.io/okhttp/, я не вижу никакой разницы, но это только отчет об ошибке

ответ

2

Это выглядит, как в вашем коде

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

вы пытаетесь вызвать метод конструктора Request «s, который является частным. Вы должны создать экземпляр нового Request.Builder(), вызвав общедоступный статический метод. Используя этот тип шаблона, вы не будете возвращаться с запросом до тех пор, пока не будет выведена окончательная строка .build();.

Ссылка: OkHttp3 Request.Builder documentation

Просто замените этот код и он должен работать.

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

EDIT:

быть также известен, что при вызове метода client.newCall(request).execute() будет выполняться синхронно, что может привести к поточным вопросам, если выполняется в основном потоке.

+0

Не разделяйте свой ответ в комментарии. Вы можете отредактировать сообщение. –

+0

Я решил, что добавлю его в качестве комментария, поскольку он не был напрямую связан с вопросом, и если OP уже обрабатывал его таким образом, он был лишним. –

+0

Это нормально, но добавление его в качестве заметки будет более эффективным, и OP сразу это увидит. –

1

Вы должны попытаться использовать Ставить вместо выполнения , Выполнение запускает запрос синхронно, что может вызвать проблемы с блокировкой основного потока. Enqueue позволит вам делать что-то в асинхронном режиме, когда вы можете обрабатывать успешные и отказоустойчивые ответы в обратных вызовах. Сделайте что-то вроде этого:

pivate String mStringUrl = "http://www.yoururl.com";   
OkHttpClient client = new OkHttpClient(); 
Request request = new Request.Builder() 
     .url(mStringUrl) 
     .build(); 
client.newCall(request).enqueue(new Callback() { 
    @Override 
    public void onFailure(Call call, IOException e) { 
     //do failure stuff 
    } 

    @Override 
    public void onResponse(Call call, Response response) throws IOException { 
     //do success stuff 
    } 
} 
+1

Большое спасибо! Я проработал его – wuxue

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