【问题标题】:Java/Android - How to set timeout external service call with handlerJava/Android - 如何使用处理程序设置超时外部服务调用
【发布时间】: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


【解决方案1】:

最好在服务调用本身中使用超时,您可以使用 service 设置超时,如果您需要知道如何设置超时那么我应该知道您使用的是哪种服务?

还有一件事是,如果您正在使用加载程序,您应该以一种可以被客户端取消的方式制作该加载程序。

【讨论】:

  • 嗨乔亚尔,感谢您的回复。我使用的服务是不可编辑的第三方服务。我正在导入一个工件以使用它。
  • 可能有设置超时的选项,请检查一下。如果没有,那么您应该使用计时器取消它。
【解决方案2】:

仍然不确定你想要实现什么,但如果你想在主线程上运行一段时间后运行一些代码(即你的代码将对 UI 做一些事情),你可以使用 android.os.Handler

    mHandler = new Handler(getMainLooper());
    mHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
            // do stuff on UI thread
        }
    },10000);

当您的呼叫从服务器返回时,只需取消队列中的消息:

    mHandler.removeCallbacksAndMessages(null);

【讨论】:

    猜你喜欢
    • 2017-11-22
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    相关资源
    最近更新 更多