2

我只是想使用 okhttp 下载一些字节数据,但是在我完成代码之前,我遇到了一个问题,android studio 报告错误,说“请求(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/上的示例,我没有看到任何区别,但它只是报告了这个错误

4

2 回答 2

4

它看起来像在你的代码中

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

您正在尝试调用Request私有的构造函数方法。Request.Builder()您必须通过调用公共静态方法来实例化一个新方法。.build();使用这种类型的模式,在调用最后一行之前,您不会返回请求。

参考:OkHttp3 Request.Builder 文档

只需替换此代码,它应该可以工作。

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

编辑:

另请注意,调用该client.newCall(request).execute()方法将同步执行,如果在主线程上执行可能会导致线程问题。

于 2016-02-24T04:16:40.663 回答
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 
    }
}
于 2016-02-24T04:14:45.380 回答