Java 在SharedReference中添加会话信息并检索它

Java 在SharedReference中添加会话信息并检索它,java,android,session,sharedpreferences,Java,Android,Session,Sharedpreferences,我想在SharedReference中存储会话密钥和其他信息,并在调用其他api时检索它。我引用这个答案-。我创建了一个单独的类MyApp并调用它的方法来存储和检索信息。这是我的第一个项目与会话,所以我不知道很多,但我尝试了这段代码 登录功能 public void LoginAPI(){ progressDialog.show(); StringRequest stringRequest = new StringRequest(Request.Method.POST, LOGI

我想在SharedReference中存储会话密钥和其他信息,并在调用其他api时检索它。我引用这个答案-。我创建了一个单独的类MyApp并调用它的方法来存储和检索信息。这是我的第一个项目与会话,所以我不知道很多,但我尝试了这段代码

登录功能

public void LoginAPI(){
    progressDialog.show();
    StringRequest stringRequest = new StringRequest(Request.Method.POST, LOGIN_URL, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {

      // My Operations with response

    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            progressDialog.dismiss();
            Snackbar.make(v,"LOGIN FAILED",Snackbar.LENGTH_SHORT).show();
        }
    }){
        @Override
        protected Map<String, String> getParams() {
            Map<String, String> params = new HashMap<>();
            // the POST parameters:
            params.put("identity", username);
            params.put("pass",password);
            return params;
        }


      //Storing Session Data
        @Override
        protected Response<String> parseNetworkResponse(NetworkResponse response) {
            MyApp.get().checkSessionCookie(response.headers);
            return super.parseNetworkResponse(response);
        }

    };
    RequestQueue queue = Volley.newRequestQueue(this);
    queue.add(stringRequest);
}

将此行添加到
android:name=“.MyApp”
文件中的应用程序标记中

<application
    android:name=".MyApp"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    android:usesCleartextTraffic="true">


试试看

我要删除
MyApp.get()
,它返回
NULL
,并静态调用它,例如:

public static boolean checkSessionCookie(Map<String, String> headers) {
    if (headers.containsKey(SET_COOKIE_KEY) && headers.get(SET_COOKIE_KEY).startsWith(SESSION_COOKIE)) {
        String cookie = headers.get(SET_COOKIE_KEY);
        if (cookie.length() > 0) {

            String[] splitCookie = cookie.split(";");
            String[] splitSessionId = splitCookie[0].split("=");
            cookie = splitSessionId[1];

            SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
            SharedPreferences.Editor prefEditor = preferences.edit();
            prefEditor.putString(SESSION_COOKIE, cookie);
            prefEditor.commit();

            return true;
        }
    }
    return false;
}
publicstaticbooleanchchecksessionokie(映射头){
if(headers.containsKey(SET_COOKIE_KEY)和&headers.get(SET_COOKIE_KEY).startsWith(SESSION_COOKIE)){
字符串cookie=headers.get(设置cookie\u键);
如果(cookie.length()>0){
String[]splitCookie=cookie.split(;);
字符串[]splitSessionId=splitCookie[0]。拆分(“”);
cookie=splitSessionId[1];
SharedReferences preferences=PreferenceManager.GetDefaultSharedReferences(getApplicationContext());
SharedReferences.Editor prefEditor=preferences.edit();
putString(会话_COOKIE,COOKIE);
提交();
返回true;
}
}
返回false;
}
可用相似
boolean hascokie=MyApp.checksessionokie(response.headers)


。。。当在
Mainfest.xml
中引用
MyApp
时,它还应该返回实例,但是
具有
静态的
上下文
字段容易出现
上下文
;最好尽可能避免。您只需从
静态方法中获取
首选项的句柄
;很可能
getApplicationContext()
就足以获得句柄。

plz显示添加的AndroidManifest.xml文件。请检查@sontruongitOk now错误已消失,但当我在中检索它时,它没有附加会话数据。你们能检查一下我的存储和检索实现是否正确吗?@AjayGohel你们应该在AddSessionOkie和CheckSessionOkie方法上设置一个断点来调试你们的应用程序,看看你们做错了什么或做错了什么。若CheckSessionOkie中的条件得到并解决了问题,它就不会进入内部。字符串会话中出现错误。\u COOKIE。我把它改成了相对字符串,现在它可以工作了。很高兴听到这个消息。快乐编码!
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.acg.digimkeyparent">
<!-- To auto-complete the email text field in the login form with the user's emails -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    android:usesCleartextTraffic="true">
    <activity
        android:name=".Slide"
        android:theme="@style/Theme.AppCompat.NoActionBar" />
    <activity
        android:name=".Login"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
    <activity
        android:name=".ForgotPassword"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
    <activity android:name=".ResetPassword" />
    <activity android:name=".EditNumber" />
    <activity android:name=".OTP" />
    <activity android:name=".ProfileChild" />
    <activity
        android:name=".SplashScreen"
        android:theme="@style/Theme.AppCompat.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <service
        android:name=".GSMRegistrationIntentService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.android.gms.iid.InstanceID" />
        </intent-filter>
    </service>

    <activity
        android:name=".MainActivity"
        android:label="@string/title_activity_main" />
    <activity android:name=".ChangePassword" />
    <activity android:name=".ChangeMobile" />
    <activity android:name=".StudentDashboard" />
</application>
</manifest>
E/Volley: [462] NetworkDispatcher.processRequest: Unhandled exception java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.acg.digimkeyparent.MyApp.checkSessionCookie(java.util.Map)' on a null object reference
      java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.acg.digimkeyparent.MyApp.checkSessionCookie(java.util.Map)' on a null object reference
          at com.example.acg.digimkeyparent.Login$5.parseNetworkResponse(Login.java:186)
          at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:132)
          at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:87)
<application
    android:name=".MyApp"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    android:usesCleartextTraffic="true">
public static boolean checkSessionCookie(Map<String, String> headers) {
    if (headers.containsKey(SET_COOKIE_KEY) && headers.get(SET_COOKIE_KEY).startsWith(SESSION_COOKIE)) {
        String cookie = headers.get(SET_COOKIE_KEY);
        if (cookie.length() > 0) {

            String[] splitCookie = cookie.split(";");
            String[] splitSessionId = splitCookie[0].split("=");
            cookie = splitSessionId[1];

            SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
            SharedPreferences.Editor prefEditor = preferences.edit();
            prefEditor.putString(SESSION_COOKIE, cookie);
            prefEditor.commit();

            return true;
        }
    }
    return false;
}