我正在使用HttpOK库和Java。我编写了以下代码:
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
...
public class RunFeed implements Runnable {
private final OkHttpClient client = new OkHttpClient();
...
private Response executeRequest(Request request){
try {
final Call call = client.newCall(request);
Response response = call.execute();
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
return response;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}我编写这类脏代码的原因是试图捕获在call.execute();行上抛出的异常。
当程序到达这一行时,程序退出(以某种方式成功),没有到达返回响应语句,也没有抛出任何异常,也没有进入catch块或到达最后一个,是的,我知道--“脏”返回空语句.
客户端和请求对象不是空的,在我看来是有效的。
另一点需要说明的是,我是在一个可运行的实现类中运行代码。
顺便说一句,当调试器到达call.execute();行时,我计算得到的表达式:
响应{protocol=http/1.1,code=200,message=OK,url=http://myurl}
看来一切都很好。但是在那之后,当我按下“步骤”按钮时,它只是完成了执行,而不是前进到if (!response.isSuccessful()).
请给我建议。
发布于 2022-01-10 13:47:49
您可以在另一个线程上而不是在主线程上运行executeRequest()方法,而call.execute()运行在主线程上。所以,当您调试call.execute()时,有足够的时间准备响应,但是当应用程序运行时,它没有这个机会,executeRequest()继续在另一个线程上执行。
我建议考虑使用call.enqueue()而不是call.execute()。
更新
如果您正在尝试测试okhttp调用,请考虑使用mockwebserver。
https://stackoverflow.com/questions/70652381
复制相似问题