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

Android-Volley RequestFuture超时

冷浩瀚
2023-03-14

我在使用Volley的RequestFuture类时遇到了一个问题。实际上,它只是停在wait(0);在下面RequestFuture类中的doget()函数中,并不会像我认为的那样被onResponseonErrorResponse唤醒。

private synchronized T doGet(Long timeoutMs)
        throws InterruptedException, ExecutionException, TimeoutException {
    if (mException != null) {
        throw new ExecutionException(mException);
    }

    if (mResultReceived) {
        return mResult;
    }

    if (timeoutMs == null) {
        wait(0);
    } else if (timeoutMs > 0) {
        wait(timeoutMs);
    }

    if (mException != null) {
        throw new ExecutionException(mException);
    }

    if (!mResultReceived) {
        throw new TimeoutException();
    }

    return mResult;
}

@Override
public boolean isCancelled() {
    if (mRequest == null) {
        return false;
    }
    return mRequest.isCanceled();
}

@Override
public synchronized boolean isDone() {
    return mResultReceived || mException != null || isCancelled();
}

@Override
public synchronized void onResponse(T response) {
    mResultReceived = true;
    mResult = response;
    notifyAll();
}

@Override
public synchronized void onErrorResponse(VolleyError error) {
    mException = error;
    notifyAll();
}

这就是我试图把上面这一切称为的方式。

    RequestFuture<JSONObject> future = RequestFuture.newFuture();
    JsonObjectRequest myReq = new JsonObjectRequest(Request.Method.POST, url, jsonObj, future, future);
    requestQueue.add(myReq);

    try {

        JSONObject response = future.get();
    } catch (InterruptedException e) {
        // handle the error
    } catch (ExecutionException e) {
        // handle the error
    }

requestqueue.add(myReq);

future.setrequest(requestqueue.add(myReq));

共有1个答案

祁均
2023-03-14

向get方法添加一个超时将提供捕捉错误的能力,如果没有超时,则它将错误发送回主线程。因此,用JSONObject response=future.get();更改JSONObject response=future.get(REQUEST_TIMEOUT,timeunit.seconds);应该可以做到这一点,并将其包装在超时的try catch中

 类似资料:
  • 问题内容: 我已经编写了用于连接外部附件的蓝牙API。该API的设计方式是,有一帮阻塞调用如,,,,等方式,这些工作是他们创造一个有效载荷发送,并调用一个名为方法,做一些准备工作,并最终做的以下: 问题在于,有时此设备会变慢或无法响应,因此我想在此呼叫上设置超时。我尝试了几种方法将此代码放入thread \ future任务并使其超时运行,例如: 这种方法的问题在于我无法在调用方法中重新抛出异常,

  • 问题内容: 我知道可以使用唤醒锁来保持屏幕,CPU等等,但是如何以编程方式更改Android手机上的“ 屏幕超时 ”设置。 问题答案: 该Settings.System提供商提供了一个SCREEN_OFF_TIMEOUT设置,可能是你在找什么。

  • 问题内容: 最近,我在程序中遇到以下错误: 产生此错误的函数如下: 该功能在普通的JAVA中可以正常使用,但是当它复制到Android时会强制转换,我不知道为什么。 问题答案: 有两种可能性, 1)您是否检查并测试了连接。 2)最好不要设置任何连接超时,如果您设置了选择的最大时间,则bcos会引发错误,如果服务器在给定时间内没有响应。

  • 背景我正试图为我的java服务器创建一个android客户端应用程序,并让它们使用TCP套接字进行通信。 当我在android设备模拟器上运行我的应用程序时,它的工作原理是什么 当我在手机上运行该应用程序时,我无法正常工作,我在创建套接字时遇到连接超时。 异常 java.net.Connect异常: 无法连接到 /10.0.2.2 (端口 9111): 连接失败: ETIMEDOUT (连接超时)

  • 我在android 11上有这个ANR。我无法找到任何合适的解决方案,即使通过它非常复杂的堆栈跟踪来理解。如有任何帮助,我们将不胜感激。 堆栈跟踪: # 00 PC 000000000007590 c/apex/com . Android . runtime/lib 64/bionic/libc . so(syscall 28)# 00 PC 0000000001 b067c/apex/com .

  • 我已经开始从许多代码位置收到几个奇怪的ANR报告(应用程序没有响应)。 null