1

HttpClient次のように、サーバー接続を行うために を使用しています。

DefaultHttpClient client = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://www.example.com/login");
HttpResponse response = client.execute(httppost);

サーバー セッションはCookieを使用します。

セッションを維持するには、後続のすべての接続に同じクライアントを使用する必要があります。私がやっていて、うまくいきます。

しかし、問題は、Android では通常、必要なときにアクティビティ データが破棄され、HttpClient(私のアプリケーションが baclground にあるときに) も破棄され、セッションが失われることです。

HttpClient永続化する方法はありますか?または、このケースをどのように解決しますか?

ありがとうございました。

4

2 に答える 2

1

セッションを保存して、アクティビティの再起動後に再作成する方法はありません。

唯一の方法は、HttpClient コードをサービスに配置することです。このようにして、アクティビティで遊ぶことができ、セッションが壊れることを心配する必要はありません。

ここでServicesドキュメントを見つけることができます

サーバー セッションは Cookie を使用します。

Android の場合、デフォルトで Cookie が有効になっているため、心配する必要はありません。

確かに Cookie を保存できますが、それがあなたの質問に何らかの形で役立つ理由がわかりません。

とにかく、これは Cookie を取得するテクニックです。

List<Cookie> mCookies = null;

mCookies = httpclient.getCookieStore().getCookies();

        if (mCookies.isEmpty()) {
            Log.d("test_runner", "Cookies: None");
        } else {
            for (int i = 0; i < mCookies.size(); i++) {
                System.out.println("- " + mCookies.get(i).toString());
                Log.d("test_runner", "Cookies: [" + i + "]" + mCookies.get(i).toString());
            }
        }

そして、これはそれらを元に戻す方法です:

 CookieStore cookieStore = new BasicCookieStore(); 

     for(Cookie cook : mCookies){
         cookieStore.addCookie(cook); 
     }

     httpclient = new DefaultHttpClient(params);
     httpclient.setCookieStore(cookieStore);
于 2013-09-14T13:38:37.460 に答える
0

最良のアイデアは、サーバーが実行するすべての機能を、接続するタスクによって呼び出される一意のクラスに配置することです。このクラスを WebServiceManager と呼びます。このクラスは、サーバーとまったく同じメソッドを持っています。

一意のセッションが必要な場合は、次のようにします。

private static WebServiceManager wsm = null;

public static WebServiceManager getInstance() {
    if (wsm == null) {
        wsm = new WebServiceManager();
    }
    return wsm;
}

private final HttpClient httpClient;

private WebServiceManager() {
    httpClient=new DefaultHttpClient();
}

次に、webServiceManager のインスタンスのメソッドを呼び出して、常に同じ httpclient を使用し、Cookie を保持します。:)

于 2014-05-19T09:00:57.667 に答える