当前位置: 首页 > 知识库问答 >
问题:

使用okhttp3发出多个异步HTTP 2.0请求

宋景福
2023-03-14
    OkHttpClient client = new OkHttpClient();
public void AsyncGet(String url) throws Exception {

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

    Call call = client.newCall(request);

    call.enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            e.printStackTrace();
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            if (!response.isSuccessful()) {
                throw new IOException("Unexpected code " + response);
            }
            new Thread() {
                @Override
                public void run() {
                    /* Some code */
                }
            }.start();
        }
    });

}
public Response SyncGet(String url) throws Exception {

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

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

    if (!response.isSuccessful()) {
        throw new IOException("Unexpected code " + response);
    }

    return response;
}
AsyncGet(Url);
AsyncGet(Url2);

但是,如下所示的调用序列使用相同的TCP连接。

SyncGet(Url);
AsyncGet(Url);
AsyncGet(Url2);

我还没有对此进行调试,但OkHttp似乎迫使我们首先在主线程上发出阻塞HTTP请求,以获得TCP连接上下文,然后与其他线程共享该上下文?或者,我是不是漏掉了什么?

共有1个答案

羊舌兴德
2023-03-14

您可以调用async to并为以后的每个调用设置扇区,根据扇区可以区分调用的响应。试试这个代码;希望对你有帮助!

为api调用创建一个单独的类:

public class RestApi {

    protected RestApiResponse serverResponse;
    protected Context c;

    public RestApi(RestApiResponse serverResponse, Context c) {
        this.serverResponse = serverResponse;
        this.c = c;
    }

    public void postDataWithoutAuth(String url,String sector) {


        OkHttpClient client = new OkHttpClient();

        Request request = new Request.Builder()
    .url("http://publicobject.com/helloworld.txt")
    .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.e("response", call.request().body().toString());
                serverResponse.onErrorLoaded(call.request().body().toString(), sector);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                serverResponse.onResponseLoaded(response, sector);
            }


        });
    }
}

然后为回调创建接口

public interface RestApiResponse {

    public void onResponseLoaded(Response response, String sector);

    public void onErrorLoaded(String response, String sector);
} 
RestApi apicall = new RestApi(this, getBaseContext());
apicall.postDataWithoutAuthUrlEncoded("ur url","your sector");
 类似资料:
  • 假设我有5个请求,我想并行发送所有5个。我可以使用CompletableFuture.allOf()来做到这一点;但是,allOf()只有在所有期货都成功时才返回,即使有一个失败也会失败。我如何从n个成功的期货中得到x,并且在并行发送请求的同时忽略失败的期货? 我正在尝试采取的步骤: .

  • 问题内容: 首先,让我解释一下上下文: 我必须创建一个客户端,该客户端将发送许多HTTP请求以下载图像。这些请求必须是异步的,因为一旦完成图像,它将被添加到队列中,然后打印到屏幕上。由于图像可能很大且响应分块,因此我的处理程序必须将其聚合到缓冲区中。 因此,我遵循Netty示例代码(HTTP勺示例)。 目前,我有三个静态映射,用于为每个通道存储通道ID和缓冲区/块布尔值/我的最终对象。 在那之后,

  • 按照这里的Apache HttpAsyncClient示例,HTTPGET请求并不是一次性触发的,而是(大部分)同步触发的。 下图显示了请求的发送顺序(除了一个)。当增加请求数量时,这仍然是正确的。 我使用了另一个库(AsynHttpClient ),请求发送得更快,而且是随机的。 有什么办法可以改进这段代码,让它真正异步执行? 我添加了用于参考的代码。

  • 问题内容: 我正在尝试使用进行同步请求。我查看了Stackoverflow并发现了这个问题:使异步alamofire请求成为sync 我看到接受的答案用于使请求同步,但是我无法使其正常工作。这是我的简化代码: 有了这段代码,我在尝试制作时会出错。我收到的错误如下: 无法调用非功能类型“布尔”的值 我尝试使用许多使用完成的示例来同步获取值(因为我需要先检索数据才能将其显示在表上,并同时获取该表的行数

  • 问题内容: PHP中有没有办法进行异步HTTP调用?我不在乎响应,我只想做类似的事情,但不等待请求完成再执行其余代码。这对于在我的应用程序中触发某种“事件”或触发较长的进程非常有用。 有任何想法吗? 问题答案: 我以前接受的答案没有用。它仍然在等待回应。但这确实有效,取自我如何在PHP中发出异步GET请求?

  • 问题内容: 我希望对其他服务器上的另一个脚本进行简单的GET请求。我该怎么做呢? 在一种情况下,我只需要请求一个外部脚本,而无需任何输出。 在第二种情况下,我需要获取文本输出。 老实说,我不想弄乱CURL,因为这实际上不是CURL的工作。我也不想使用http_get,因为我没有PECL扩展名。 fsockopen可以工作吗?如果是这样,该如何在不读取文件内容的情况下执行此操作?有没有其他办法? 谢