0

在我的应用程序中,我使用的是 PHP Web 服务器。

在主要活动中,我使用用户名和密码连接到服务器。使用这些值,服务器开始我的会话。

因此,为了维护会话,我在整个应用程序中使用相同的 HTTP 客户端。

public static HttpClient httpclient = new DefaultHttpClient();

但问题是,大多数情况下,如果我想从服务器获取数据,我会使用后台线程来获取数据,然后更新 UI 线程。因此,当我在后台分配客户端并且用户尝试通过单击 UI 上的按钮来建立其他连接时。它给了我这个例外

Invalid use of SingleClientConnManager: connection still allocated.

我正在捕获此异常,因此应用程序不会崩溃,但会话正在被破坏。因此我最终在某些视图中显示“空”。

谁能帮助我如何以更好的方式维护会话以及如何避免此 SingleClientConnManager 异常。

谢谢你

我想到了这种方法:

当应用程序崩溃或给出 singleClientConnManager 异常(在任何一种情况下会话都丢失)时,使用java.lang.Thread.UncaughtExceptionHandleri 再次连接到服务器,使用使用 Shared Preferences 存储的用户名和密码(这将再次启动会话),然后重新启动当前活动。我没有尝试过,但我想知道这是一个好习惯吗?

4

1 回答 1

1

您应该尝试避免该异常,而不是捕获它并解决它!建议的方法对我来说看起来不是好的做法。

在我看来,问题在于您只有一个连接,但用户可以启动 2。如果是这种情况,您应该能够处理它,或者阻止用户这样做。

  • 一种选择是:认识到您已经有一个连接(不要依赖这个例外),然后开始一个新的连接。我的意思是,在这种情况下,您不依赖于抛出异常的连接,而是通过“正常”方式检查是否已经存在一个异常(例如一些变量)。你可以从那里开始听起来有点像黑客(重新启动活动和所有),但最好是等待异常。

  • 另一种选择可能是在其他请求仍在进行时阻止用户按下按钮,但这取决于您的应用程序可能是用户界面失败。这取决于用户看到什么以及我猜发生了什么。您可以通过使用微调器来做到这一点,禁用除表单之外的所有按钮,有很多方法可以实现这一点。

  • 最后,您可能希望将请求“排队”并仅在完成宝贵的请求后将其发送到服务器。这样您就可以毫无例外地使用连接。我的意思是你保持一切原样,但是按下第二个按钮后的动作是记住你必须做这个动作,在第一个动作返回后,然后检查是否还有其他事情要做。

不要依赖异常来处理代码流!

于 2012-08-08T07:17:05.893 回答