【问题标题】:issue with sessions in androidandroid中的会话问题
【发布时间】:2012-08-08 06:47:56
【问题描述】:

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

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

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

public static HttpClient httpclient = new DefaultHttpClient();

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

Invalid use of SingleClientConnManager: connection still allocated.

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

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

谢谢

我想到了这个办法:

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

【问题讨论】:

    标签: php android session httpclient


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 1.如果我发现连接仍然存在,我应该启动一个新连接(因为必须使用同一个客户端来维护会话),所以你的意思是我应该等待连接完成? 2. 通过阻止用户单击按钮,您的意思是使用 AsyncTask 并显示 spinnerDialog 直到连接完成。? 3. 这与第 2 点类似,但此处单击按钮时会显示 SpinnerDialog,因为客户端仍分配在其他位置....请解释理解您的观点是否有误
    • 我在答案中添加了答案/额外的解释,而不是作为评论:)
    • 你能再解释一件事吗?为什么当我收到 SingleClientConnManager 异常时会丢失会话。我认为只有当应用程序崩溃时会话才会丢失。但是即使在捕获异常之后,为什么会话会丢失?谢谢
    • 我不确定,抱歉。您为此使用了一个对象,因此可能是一个对象引发了异常(然后“退出”),但这只是猜测,很可能是别的东西。
    猜你喜欢
    • 1970-01-01
    • 2013-02-04
    • 2016-11-28
    • 1970-01-01
    • 2011-06-01
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    相关资源
    最近更新 更多