【问题标题】:sharedpreferences data lost when press back button android?按后退按钮android时sharedpreferences数据丢失?
【发布时间】:2015-11-02 06:26:26
【问题描述】:

我有登录活动并将数据保存到 sharedpreferences 数据存储中。

当我打开应用程序然后第一次登录活动加载并填写用户凭据并存储在 sharedpreferences 中时,打开 Main Activity 但是当我按下 Main Activity 上的返回按钮时 sharedpreferences 数据丢失。

下次我打开应用时,它显示的登录活动应该是打开的主活动,因为这次我匹配了来自 sharedpreferences 的数据。

我的登录活动完整代码

public class Login extends AppCompatActivity implements     View.OnClickListener {

private String output;
private Toolbar toolbar;
private Button button;
EditText Username,Password;
String myURL,userValue,passValue;
public static final String DEFAULT="N/A";
List<DataModel> loginList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    toolbar = (Toolbar) findViewById(R.id.app_bar);
    setSupportActionBar(toolbar);

    Username = (EditText) findViewById(R.id.etUsername);
    Password = (EditText) findViewById(R.id.etPassword);

    button = (Button) findViewById(R.id.btn_login);
    button.setOnClickListener(this);

    SharedPreferences sharedPreferences = getSharedPreferences("loginData",this.MODE_PRIVATE);
    String user = sharedPreferences.getString("username",DEFAULT);
    String pass = sharedPreferences.getString("password",DEFAULT);

    if(user.equals(DEFAULT) || pass.equals(DEFAULT) && user==null && pass ==null)
    {
        Toast.makeText(this,"No Data was found",Toast.LENGTH_LONG).show();
    }else{
        Toast.makeText(this,"Data was found",Toast.LENGTH_LONG).show();
        Toast.makeText(this,user+pass,Toast.LENGTH_LONG).show();
        CheckOnline();
    }

}
private void CheckOnline() {
    if(inOnline())
    {
        String user,pass="";
        SharedPreferences sharedPreferences = getSharedPreferences("loginData", this.MODE_PRIVATE);
        user = sharedPreferences.getString("username", DEFAULT);
        pass = sharedPreferences.getString("password", DEFAULT);
        String getStatus = sharedPreferences.getString("LoggedIn", DEFAULT);
        if (getStatus.equals("true")) {
            Toast.makeText(this, user + pass, Toast.LENGTH_LONG).show();
            myURL = "http://www.example.com/extra/login.php?user=" + user + "&pass=" + pass;
            requestData(myURL);
        }
    }
    else
    {
        Toast.makeText(this, "Network isn't available", Toast.LENGTH_LONG).show();
    }
}
protected boolean inOnline()
{
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    if(netInfo!=null && netInfo.isConnectedOrConnecting())
    {
        return true;
    }
    else{
        return false;
    }
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

private void requestData(String uri) {
    LoginCheck check=new LoginCheck();
    check.execute(uri);
}



@Override
public void onClick(View v) {

   // startActivity(new Intent(this, MainActivity.class));
    if(v.getId()==R.id.btn_login)
    {
        if(inOnline())
        {
            userValue = Username.getText().toString();
            passValue = Password.getText().toString();
            myURL = "http://www.example.com/extra/login.php?user="+userValue+"&pass="+passValue;
            requestData(myURL);
        }
        else
        {
            Toast.makeText(this, "Network isn't available", Toast.LENGTH_LONG).show();
        }
        //  LoginCheck loginCheck = new LoginCheck();
      //  loginCheck.execute(new String[]{"http://www.dialerphilippines.com/predictivedialervoip/extra/login.php"});
    }
}



protected String updateDisplay()
{
    if(loginList != null) {
        for(DataModel login : loginList) {
            output = (login.getLoginResult() + "\n");
        }
    }
    else{
        output = "null hai";
    }
    return output;
}

@Override
public void onBackPressed() {
    Login.this.finish();
}

private class LoginCheck extends AsyncTask<String,String,String>{
    ProgressDialog dialog = new ProgressDialog(Login.this);
    @Override
    protected void onPreExecute() {
        dialog.setMessage("Login....");
        dialog.show();
    }

    @Override
    protected String doInBackground(String... params) {

        String content = null;
        try {
            content = HttpManager.getData(params[0]);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
        return content;
    }

    @Override
    protected void onPostExecute(String result) {
     //   loginList = JSONParser.parseLogin(result);
      //  String my = StringUtils.deleteWhitespace
      //  startActivity(new Intent(this, MainActivity.class));
       String strWithoutWhiteSpace = result.trim();
      //  Integer res = Integer.parseInt(strWithoutWhiteSpace);

        if(strWithoutWhiteSpace.equals("success")) {
            SharedPreferences sharedPreferences = getSharedPreferences("loginData",MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPreferences.edit();
            editor.putString("username",userValue);
            editor.putString("password", passValue);
            editor.putString("LoggedIn", "true");
            editor.commit();

            startActivity(new Intent(Login.this, MainActivity.class));
            finish();
        }
        else{
            Toast.makeText(Login.this, "Either Username or Password is not correct", Toast.LENGTH_SHORT).show();
        }
        dialog.dismiss();
    }
}
}

【问题讨论】:

  • 发布您存储SharedPreferences的代码。
  • 确保您使用的是SharedPreferences .Editor.commit()apply()
  • 这个if条件背后的逻辑是什么? if(user.equals(DEFAULT) || pass.equals(DEFAULT) &amp;&amp; user==null &amp;&amp; pass ==null) !!! :)

标签: android sharedpreferences


【解决方案1】:

在共享偏好中插入数据

SharedPreferences.Editor editor = getSharedPreferences(FILE_NAME, MODE_PRIVATE).edit();
editor.putString("name", "John");
editor.putInt("fName", "ALEX");
editor.commit();

从存储的共享偏好中取回数据

SharedPreferences prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE); 
String name = prefs.getString("name", "default_value"); 
String fName= prefs.getInt("fName", "default_value");

【讨论】:

    【解决方案2】:

    您可以创建另一个共享偏好值来保存 Isloggedin 的条件是否为真,并使用它来重定向您的活动。

    String getStatus = pref.getString("LoggedIn", "nil");
    if (getStatus.equals("true")) {
        // go to main or wherever your want.
        startActivity(new Intent(this, MYActivity.class));
    } else {
        // TO DO - go to login page
    }
    

    当登录验证并且您正在更新您的共享偏好或“输入”您的值以进行登录时;更新您的 isloggedin 首选项。

    editor.putString("LoggedIn", "true");
    editor.commit();
    

    还可以通过覆盖 onbackpressed 来控制您的 backpressed 事件。

    @Override
    public void onBackPressed() {
        // TO DO
    
    }
    

    Providing Proper Back Navigation

    编辑
    在您的附加信息之后: 1. 我不确定在 onbackpressed 活动中完成你的活动有什么帮助。最好将您的活动重定向到其他地方,而不是完成活动。这对我来说没有意义。例如

    @Override
    public void onBackPressed() {
        // TO DO
        startActivity(new Intent(this, SomeActivityIWantTheUserToGoto.class));
    }
    

    另外,我看不到你从哪里得到字符串结果。

    除此之外。我建议你实施我的建议。完全地,审查您的字符串结果。这个问题越来越多,到了某个时间点我无法继续参加。
    谢谢。

    edit2

    我建议您在 postexecute 中记录结果。实际检查结果是什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多