请求(okhttp3.Request.Builder)在 okhttp3.Request 中具有私有访问权限

Request(okhttp3.Request.Builder) has private access in okhttp3.Request

我只想使用 okhttp 下载一些字节数据,但是在我完成代码之前,我 运行 遇到了一个问题 android studio 报告了一个错误 "Request(okhttp3.Request.Builder) has private access in 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/ 上的示例进行操作,我没有看到任何区别,但它只是报告此错误

您应该尝试使用排队而不是执行。 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 
    }
}

在你的代码中看起来像

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

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

参考:OkHttp3 Request.Builder documentation

只需替换为此代码即可。

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

编辑:

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