2016-02-24 55 views
2

我只想使用okhttp下載一些字節數據,但在我完成代碼之前,我遇到了一個問題,android studio報告了一個錯誤說:「請求(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的構造方法,它是私有的。您必須通過調用公共靜態方法來實例化新的Request.Builder()。使用這種類型的模式,您將不會被請求返回,直到調用最後的.build();行。

參考:OkHttp3 Request.Builder documentation

與此代碼只需更換它應該工作。

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

編輯:

另外要注意,調用client.newCall(request).execute()方法將同步執行,如果在主線程上執行時可能會導致線程問題。

+0

不要在評論中分割你的答案。您可以編輯帖子。 –

+0

我想我會添加它作爲評論,因爲它與問題沒有直接關係,如果OP已經以這種方式處理它是多餘的。 –

+0

沒關係,但將其作爲便箋添加會更有效,OP會立即看到。 –

1

你應該嘗試排隊使用,而不是執行。 Execute會同步運行請求,這可能會導致阻塞主線程的問題。 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