【问题标题】:Shared Preference not holding session (Android K)共享首选项不举行会话 (Android K)
【发布时间】:2017-02-27 12:34:46
【问题描述】:

我有一个使用共享首选项进行会话管理的项目。代码一切都很好,但真正令人讨厌的是该应用程序在 Android Lollipop 及更高版本中保持会话,但不幸的是它在 Android Kitkat 及更低版本中不保持相同。只要应用程序关闭,会话就会丢失,您必须再次登录。以下是我正在使用的代码:

Session.java

package com.saptak.disputesession;
import android.content.Context;
import android.content.SharedPreferences;
import java.util.HashMap;
/**
 * Created by Saptak Das on 27-02-2017.
 */

public class Session {

    SharedPreferences sharedPreferences;
    SharedPreferences.Editor editor;

    Context context;

    public static String KEY_FNAME="namef";
    public static String KEY_LNAME="namel";
    public static String IS_LOGIN;

    public Session(Context context) {
        this.context = context;
        sharedPreferences=context.getSharedPreferences("userdetails",0);
        editor=sharedPreferences.edit();
    }

    public  void CreateLoginSession(String fname,String lname)
    {
        editor.putString(KEY_FNAME,fname);
        editor.putString(KEY_LNAME,lname);
        editor.putString(IS_LOGIN,"logged");
        editor.commit();
    }

    public HashMap<String,String> getdetails()
    {
        HashMap<String,String> details=new HashMap<>();
        details.put(KEY_FNAME,sharedPreferences.getString(KEY_FNAME,null));
        details.put(KEY_LNAME,sharedPreferences.getString(KEY_LNAME,null));
        return details;
    }

    public boolean loginstatus()
    {
        if(sharedPreferences.getString(IS_LOGIN,"unlogged").equals("logged"))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    public void logoutac()
    {
        editor.clear();
        editor.commit();
    }
 }

Login.java

package com.saptak.disputesession;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

/**
 * Created by Saptak Das on 27-02-2017.
 */

public class Login extends Activity {

    Button login;
    EditText first,last;

    Session session;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout);
        session=new Session(getApplicationContext());
        login=(Button)findViewById(R.id.log);
        first=(EditText)findViewById(R.id.fname);
        last=(EditText)findViewById(R.id.lname);
        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                session.CreateLoginSession(first.getText().toString(),last.getText().toString());
                startActivity(new Intent(getApplicationContext(), MainActivity.class));
                finish();
            }
        });
    }
}

MainActivity.java

package com.saptak.disputesession;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.util.HashMap;

public class MainActivity extends AppCompatActivity {

    Session session;
    Boolean flag;

    TextView tf,tl;

    Button logout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        session=new Session(getApplicationContext());
        tf=(TextView)findViewById(R.id.xfname);
        tl=(TextView)findViewById(R.id.xlname);
        logout=(Button)findViewById(R.id.xlogout);
        flag=session.loginstatus();
        if(flag==false)
        {
            startActivity(new Intent(getApplicationContext(),Login.class));
            finish();
        }
        HashMap<String,String> details=session.getdetails();
        tf.setText(details.get(Session.KEY_FNAME));
        tl.setText(details.get(Session.KEY_LNAME));
        logout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                session.logoutac();
                startActivity(new Intent(getApplicationContext(),Login.class));
                finish();
            }
        });
    }
}

这个问题现在让我很紧张,因为该应用程序编码完美,请帮助我。提前致谢!

更新:

请注意,问题不在于删除会话,它完全相反。每次我关闭应用程序时,会话都会自行注销。这个问题只在 Android Kitkat 及以下版本的情况下,适用于 Android Lollipop 及以上版本

【问题讨论】:

  • 使用editor.apply();代替editor.commit();
  • @WadeTyler 我使用了 editor.apply() 但它不起作用。关闭应用后会话丢失
  • @IntelliJAmiya 问题不在于删除共享首选项,而是相反。正如我在问题中所述,当我关闭应用程序时会话丢失
  • @IntelliJAmiya 好的,我将在 fb 中向您发送演示视频

标签: android session sharedpreferences


【解决方案1】:

SharedPreferences允许您以键值对的形式保存和检索数据。

错误

public static String IS_LOGIN="logged"; // Init here 

仅供参考

当您希望通过以下方式全局存储用户数据时,Session 非常有用 退出应用程序。

纠正你的方法

public  void CreateLoginSession(String fname,String lname)
{
    editor.remove(KEY_FNAME); //Remove at first
    editor.remove(KEY_LNAME);
    editor.remove(IS_LOGIN);
    editor.putString(KEY_FNAME,fname);
    editor.putString(KEY_LNAME,lname);
    editor.putString(IS_LOGIN,"logged");
    editor.commit();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    相关资源
    最近更新 更多