【发布时间】:2017-01-30 22:14:40
【问题描述】:
我的场景是一个 onCreate() 活动方法,它执行以下代码(简化):
dialog.show(); //loading wheel
try {
remote.sendRequest(myData, new MyHandler());
}
catch (Exception e) {
dialog.dismiss();
//log and react
}
class MyHandler extends SDKSpecificCompiledHandler {
@Override
public void failure() {
dialog.dismiss();
//do stuff
}
@override
public void success() {
dialog.dismiss();
//do stuff
}
}
//I have read-only access to this handler!
public abstract class SDKSpecificCompiledHandler {
public abstract void success(JSONObject successData);
public abstract void failure(JSONObject errorData);
}
说明:调用远程服务时传递一个处理程序,该处理程序在完成后被调用。在成功、失败或异常发生之前,向用户显示加载轮(对话框)。
问题是当服务被成功调用但没有响应时。在这种情况下,dialog.dismiss() 不会被调用,加载轮会永远旋转。
我需要的是一种超时,如果服务器没有返回,它会在几秒钟后关闭对话框(并可能采取其他操作)。
我的第一个想法是为服务调用创建一个新线程,并在启动后立即设置一个计时器来关闭对话框。 这是个好主意吗?
谢谢,
编辑:
该服务是第三方/不可编辑。我正在使用预编译的工件。
【问题讨论】:
-
为什么不使用现有的 http 库,经过许多应用程序的测试和验证 - okhttp、retrofit、volley?这将为您处理各种 http 问题,包括超时。无论如何,创建一个新线程不是一个好主意。无论如何,您的网络调用都应该在工作线程上,因此只需将处理程序附加到该线程并发布延迟消息来处理您的超时情况。如果您的调用在延迟消息之前返回,请从所有消息中清除处理程序,或类似的东西
-
感谢您回答 Vkislincins。通过编辑我不能使用任何 http 库来请求,因为我实际上是从第三方 SDK 调用的。我可能会使用您建议的方法。谢谢。
-
好的,也许可以发布更多关于您正在使用的 SDK 以及
remote对象的信息 -
这是一个私有的SDK,我不能。
remote依赖于另一个服务。因此remote本身是可访问的但是,他可能无法返回处理程序,因为它只支持成功 和失败。这就是为什么我需要自己的逻辑来实现超时。关闭对话框并通知用户服务器没有返回的东西。 -
我很困惑。
remote是神秘的私有 SDK 的一部分,但它很乐意接受您的自定义类作为参数?这没有任何意义。另外,如果它是自定义类而不扩展任何其他对象,为什么还要覆盖 Handler 类中的方法?
标签: java android asynchronous callback timeout