我在使用Volley的RequestFuture类时遇到了一个问题。实际上,它只是停在wait(0)
;在下面RequestFuture类中的doget()
函数中,并不会像我认为的那样被onResponse
或onErrorResponse
唤醒。
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));
向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