0

私のアプリケーションでは、PHPWebサーバーを使用しています。

メインアクティビティでは、ユーザー名とパスワードを使用してサーバーに接続します。これらの値を取得して、サーバーはセッションを開始します。

したがって、セッションを維持するために、アプリケーション全体で同じHTTPクライアントを使用します。

public static HttpClient httpclient = new DefaultHttpClient();

しかし、問題は、ほとんどの場合、サーバーからデータをフェッチする場合、バックグラウンドスレッドを使用してデータを取得し、UIスレッドを更新することです。したがって、クライアントがバックグラウンドで割り当てられ、ユーザーがUIのボタンをクリックして別の接続を確立しようとした場合。それは私にこの例外を与えます

Invalid use of SingleClientConnManager: connection still allocated.

この例外をキャッチしているので、アプリケーションはクラッシュしませんが、セッションは破棄されます。したがって、一部のビューに「Null」が表示されることになります。

誰かが私にセッションをより良い方法で維持する方法とこのSingleClientConnManager例外を回避する方法を手伝ってもらえますか?

ありがとうございました

私はこのアプローチを考えました:

アプリケーションがクラッシュするか、singleClientConnManager例外が発生した場合(いずれの場合もセッションが失われます)java.lang.Thread.UncaughtExceptionHandler、共有設定を使用して保存されたユーザー名とパスワードを使用してサーバーに再度接続し(これによりセッションが再開されます)、現在のアクティビティ。私はこれを試しませんでしたが、それが良い習慣であるか知りたいですか?

4

1 に答える 1

1

例外をキャッチして回避するのではなく、その例外を回避するようにしてください。提案されたアプローチは、私には良い習慣のようには見えません

問題は、接続が1つしかないように見えますが、ユーザーは2を開始できます。その場合は、それを処理できるか、ユーザーがそうしないようにする必要があります。

  • 1つのオプションは次のとおりです。すでに接続があることを認識し(この例外に依存しないでください)、新しい接続を開始します。つまり、この場合、例外をスローする接続に依存しませんが、「通常の」手段(たとえば、いくつかの変数)によってすでに1つあるかどうかを確認します。ちょっとしたハックのように聞こえる(アクティビティとすべてを再開する)ことでそこから進むことができますが、例外を待つよりも良いです。

  • もう1つのオプションは、他の要求がまだ進行している間、ユーザーがボタンを押さないようにすることですが、アプリケーションによっては、ユーザーインターフェイスが失敗する可能性があります。それは、ユーザーが何を見て何が起こっているかによって異なります。スピナーを使用して、フォーム以外のすべてのボタンを無効にすることでこれを行うことができます。これを実現する方法は多数あります。

  • 最後に、リクエストを「キューに入れ」、貴重なリクエストが完了した後でのみサーバーに送信することをお勧めします。このようにして、例外なく接続を使用できます。つまり、すべてをそのままにしておくということですが、2番目のボタンを押した後のアクションは、アクションを実行する必要があることを覚えておいて、最初のアクションが戻った後、他に何かすることがあるかどうかを確認することです。

コードのフローの例外に依存しないでください!

于 2012-08-08T07:17:05.893 に答える