Android异步Http客户端(loopj)和持久性Cookie存储

nkn*_*knj 4 cookies android http android-asynctask

我是Android开发的新手.有几个问题是什么是使上述库最佳地工作的最佳方法.

目前,我的应用程序中有三个活动.MainActivity,LoginActivity和HomeActivity.应用程序启动MainActivity,用于检查此人是否已登录.如果此人已登录,则重定向到Home,否则重定向到Login.

正如文档中提到的,我创建了一个RestClient类.我可以在LoginActivity中成功发出请求并获得响应.这是我的登录代码.

public void login() {
        RequestParams params = new RequestParams();
        params.put(AUTH_PARAMETER_EMAIL, mEmail);
        params.put(AUTH_PARAMETER_PASSWORD, mPassword);

        RestClient.setCookieStore(new PersistentCookieStore(this));
        RestClient.post(AUTH_URL, params, new JsonHttpResponseHandler() {
            @Override
            public void onFinish() {
                showProgress(false);
            }

            @Override
            public void onSuccess(JSONObject response) {
                String response_status = null;
                try {
                    response_status = response.getString(AUTH_RESPONSE_STATUS);
                } catch (JSONException e) {
                    Toast.makeText(LoginActivity.this,
                            "ERROR: " + e.toString(), Toast.LENGTH_LONG).show();
                    Log.e(TAG, e.toString());
                }
                if (response_status.equals(AUTH_SUCCESS_STATUS)) {
                    finish();
                } else {
                    mPasswordView
                            .setError(getString(R.string.error_incorrect_password));
                    mPasswordView.requestFocus();
                }
            }

            @Override
            public void onFailure(Throwable e, String content) {
                Toast.makeText(LoginActivity.this, "ERROR: " + e.toString(),
                        Toast.LENGTH_LONG).show();
                Log.e(TAG, e.toString());
            }

        });
    }
Run Code Online (Sandbox Code Playgroud)

问题

  1. 这将在每次发出请求时创建一个新的cookie存储.我应该把它放在哪里,以便它只创建一次?我应该将它放在MainActivity的onCreate中,然后将其分配给全局变量吗?这是最好的做法吗?
  2. 在我的MainActivity中,如何检查从服务器发送的会话cookie?我知道这是共享偏好,但我怎么能得到它?文档没有说明它将在SharedPreferences中存储的变量.
  3. 当我需要注销某人时,是否删除共享首选项或删除cookie商店或两者?它们会自动保持同步吗?
  4. 当应用程序重新启动时,如何从共享首选项中保存的数据初始化cookie存储?
  5. 如果您知道任何正确实现此功能的开源代码,我会很高兴看到它并自己回答这些问题.只需提供一个链接!

nkn*_*knj 5

所以这就是我到目前为止所做的.它有效,但我不确定这是否是最佳做法.

1)cookie存储从共享首选项初始化.所以每次需要时都要创建一个新的.一定要每次使用相同的上下文.我在用getApplicationContext()

2)和4)饼干商店为您提供全部服务.只需使用与之前创建的相同的上下文创建一个新的.只要您保持一致,cookie就会正确初始化.

3)cookie存储保持共享首选项及其本地属性同步,因此只需调用 (new PersistentCookieStore(getApplicationContext())).clear();

我的守则

RestClient.java

public static void setCookieStore(PersistentCookieStore cookieStore) {
    client.setCookieStore(cookieStore);
}
Run Code Online (Sandbox Code Playgroud)

LoginActivity.java

RestClient.setCookieStore(new PersistentCookieStore(getApplicationContext()));
Run Code Online (Sandbox Code Playgroud)

MainActivity.java

private void loginRouter() {
    PersistentCookieStore mCookieStore = new PersistentCookieStore(
            getApplicationContext());
    List<Cookie> cookies = mCookieStore.getCookies();
    for (Cookie c : cookies) {
        if (c.getName().equals("session")) {
            startActivity(new Intent(this, HomeActivity.class));
            finish();
        }
    }
    launchSplashPage();
}
Run Code Online (Sandbox Code Playgroud)