Java / Android - 如何使用处理程序

时间:2016-09-22 11:04:26

标签: java android asynchronous callback timeout

我的场景是一个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()没有被调用,加载轮一直在旋转。

我需要的是一种超时,如果服务器没有回来,它会在几秒钟之后解除对话(并可能采取其他行动)。

我的第一个问题是为服务调用创建一个新线程,并在启动后立即设置一个解除对话框的计时器。 这会是一个好主意吗?

谢谢,

修改

该服务是第三方/不可编辑。我使用的是预先编译的工件。

2 个答案:

答案 0 :(得分:0)

最好在服务呼叫本身中使用超时,你可以用服务设置超时,如果你需要知道如何设置超时,那么我应该知道你正在使用什么样的服务?

还有一件事是,如果您使用的是加载程序,则应该以可以由客户端取消的方式创建该加载程序。

答案 1 :(得分:0)

仍然不能确定你想要实现的目标但是如果你想在主线程上运行一些代码(即你的代码会在UI中运行),你可以使用{{1} }

android.os.Handler

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

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