2

我的应用程序连接到服务器,当我退出应用程序时,我必须从服务器注销。

我的问题是响应延迟:我的应用程序退出速度不够快,我必须等待服务器的响应才能离开 Handler。

响应并不重要,我确定如果我发送 get,它会注销。

那么,是否可以注销(通过 http get)并关闭我的应用程序而不等待响应(但不停止“获取过程”)?

就像我用浏览器在电脑上做的那样:我点击注销按钮,然后我关闭浏览器,而不是等待来自服务器的欢迎页面......

我尝试添加一个短的套接字超时,但服务器没有注销。

这是我的方法:

private void Disconnect() {

new Thread() {
    @Override
    public void run() {
        String errorMessage = null;
        Message msg = authHandler.obtainMessage();
        try {

            HttpGet httpGet = new HttpGet(LogoutURL);
            HttpResponse httpResponse = httpclient.execute(httpGet);
            if (httpResponse.getStatusLine().getStatusCode() != 200) {
                msg.what = AuthERR;
                authHandler.sendMessage(msg);
                return;
            }

            msg.what = AuthEND;
            msg.obj = choix;
            authHandler.sendMessage(msg);

        } catch (ClientProtocolException e) {
            errorMessage = e.toString();
        } catch (IllegalArgumentException e) {
            errorMessage = e.toString();
        } catch (IOException e) {
            errorMessage = e.toString();
        } catch (Exception e) {
            errorMessage = e.toString();
        } finally {
            if (errorMessage != null) {
                Log.e("Logout", errorMessage);
                msg.what = AuthUnknownHostException;
                msg.obj = errorMessage;
                authHandler.sendMessage(msg);
            }
        }
    }
}.start();
}
4

3 回答 3

2

HTTP 是半双工请求-响应协议。在您收到响应之前,您无法证明该请求已发送到服务器。由于网络问题,它可能会丢失。

于 2013-01-12T13:23:33.733 回答
2

如果您立即退出应用程序,如何知道服务器已收到注销请求?我建议将服务器更改为立即发送响应,然后在后台完成注销,这样您的客户端就会有快速响应。

于 2013-01-12T13:25:01.303 回答
0

如果库不提供放弃连接的方法,您可以简单地退出。

Thread logoutThread = new LogoutThread();
logoutThread().start();
logoutThread.join(1000);
System.exit(0);

假设,根据经验,在大多数情况下 1 秒就足够了。当然,没有将注销请求传递到服务器是有风险的,但这在网络应用程序中总是可以预料到的。

于 2013-01-12T16:53:29.777 回答