SharedPreferences.Editor apply(); 无效

博客介绍了SharedPreferences.Editor的commit和apply方法。二者都是原子性操作,但原子操作不同,commit是原子提交到数据库,为同步过程,效率比apply异步提交慢;apply无返回值,无法知道存储是否失败,不关心结果时可优先用apply。

SharedPreferences.Editor   commit();  apply();

commit和apply虽然都是原子性操作,但是原子的操作不同,commit是原子提交到数据库,所以从提交数据到存在Disk中都是同步过程,中间不可打断。而commit方法的原子提交是同步过程,效率会比apply异步提交的速度慢,但是apply没有返回值,永远无法知道存储是否失败。在不关心提交结果是否成功的情况下,优先考虑apply方法。

package com.example.myapplication; import android.content.ContentValues; import android.content.Intent; import android.content.SharedPreferences; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Build; import android.os.Bundle; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; import android.view.View; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; //登录页面,主要包含: //用户登录验证、 //记住密码功能、 //自动填充密码、 //登录状态保存、 //登录历史记录 public class MainActivity extends AppCompatActivity { //声明UI组件变量 private EditText main_Username,main_Password; private TextView main_Forgetpassword,main_Register; private Button btn_Login; private CheckBox cb_Rememberpassword; private UserDatabase userDb; private SharedPreferences sharedPreferences; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); EdgeToEdge.enable(this); setContentView(R.layout.activity_main); userDb=new UserDatabase(this); sharedPreferences=getSharedPreferences("login_pref",MODE_PRIVATE); //检查是否已登录,如果已登录,直接跳转到主页并结束当前Activity boolean isLoggedIn=sharedPreferences.getBoolean("isLoggedIn",false); if(isLoggedIn){ String username=sharedPreferences.getString("username",""); Intent intent=new Intent(MainActivity.this, HomeActivity.class); intent.putExtra("username",username); startActivity(intent); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); finish(); return; } //初始化UI组件 main_Username=findViewById(R.id.main_Username); main_Password=findViewById(R.id.main_Password); main_Forgetpassword=findViewById(R.id.main_Forgetpassword); main_Register=findViewById(R.id.main_Register); cb_Rememberpassword=findViewById(R.id.cb_Rememberpassword); btn_Login=findViewById(R.id.btn_Login); main_Register=findViewById(R.id.main_Register); //登录按钮点击事件 btn_Login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { loginUser(); } }); //忘记密码点击事件 main_Forgetpassword.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this,"请联系管理员重置密码",Toast.LENGTH_SHORT).show(); } }); //立即注册点击事件 main_Register.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(MainActivity.this, RegisterActivity.class); startActivity(intent); } }); //为账号输入框添加文本变化监听器 main_Username.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if(cb_Rememberpassword.isChecked()){ String username=main_Username.getText().toString().trim(); if(!TextUtils.isEmpty(username)){ fillPassword(username); } } } @Override public void afterTextChanged(Editable s) { } }); ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); } //自动填充密码 private void fillPassword(String username){ SQLiteDatabase db=userDb.getReadableDatabase(); Cursor cursor=db.query(//查询账号对应的密码 UserDatabase.TABLE_USERS, new String[]{UserDatabase.COLUMN_PASSWORD}, UserDatabase.COLUMN_USERNAME+"=?", new String[]{username}, null,null,null ); //如果查询到结果,填充到密码输入框 if(cursor != null && cursor.moveToFirst()){ String storedPassword=cursor.getString(cursor.getColumnIndexOrThrow(UserDatabase.COLUMN_PASSWORD)); main_Password.setText(storedPassword); cursor.close(); } db.close(); } //检查记住密码状态,记住密码选框 private void checkRememberedPassword() { boolean isRemembered=sharedPreferences.getBoolean("isRemembered",false); if(isRemembered){ // String username=sharedPreferences.getString("username",""); // String password=sharedPreferences.getString("password",""); // main_Username.setText(username); // main_Password.setText(password); cb_Rememberpassword.setChecked(true); }else{ cb_Rememberpassword.setChecked(false); } } //用户登录方法,验证用户名和密码,登陆成功后跳转到主页 private void loginUser(){ String username=main_Username.getText().toString(); String password=main_Password.getText().toString(); boolean remembered=cb_Rememberpassword.isChecked(); if(TextUtils.isEmpty(username)){ Toast.makeText(this,"请输入用户名",Toast.LENGTH_SHORT).show(); return; } if(TextUtils.isEmpty(password)){ Toast.makeText(this,"请输入密码",Toast.LENGTH_SHORT).show(); return; } SQLiteDatabase db=userDb.getReadableDatabase(); Cursor cursor= db.query(//查询用户信息 UserDatabase.TABLE_USERS, new String[]{UserDatabase.COLUMN_USER_ID,UserDatabase.COLUMN_PASSWORD}, UserDatabase.COLUMN_USERNAME+"=?", new String[]{username}, null,null,null ); if (cursor != null && cursor.moveToFirst()){ int userId=cursor.getInt(cursor.getColumnIndexOrThrow(UserDatabase.COLUMN_USER_ID)); String storedPassword=cursor.getString(cursor.getColumnIndexOrThrow(UserDatabase.COLUMN_PASSWORD)); cursor.close(); if(password.equals(storedPassword)){ Toast.makeText(this,"登录成功",Toast.LENGTH_SHORT).show(); saveLoginStatus(username,remembered,password); recordLoginHistory(userId); Intent intent=new Intent(MainActivity.this,HomeActivity.class); intent.putExtra("username",username); startActivity(intent); finish(); } else { Toast.makeText(this,"密码错误",Toast.LENGTH_SHORT).show(); } } else{ if(cursor != null){ cursor.close(); } Toast.makeText(this,"用户名不存在",Toast.LENGTH_SHORT).show(); } db.close(); } //保存登录状态方法 private void saveLoginStatus(String username, boolean remembered, String password) { SharedPreferences.Editor editor=sharedPreferences.edit(); editor.putBoolean("isLoggedIn",true); editor.putString("username",username); //检查是否记住密码 checkRememberedPassword(); //是否记住密码 if(remembered){ editor.putBoolean("isRemembered",true); editor.putString("password",password); }else { editor.putBoolean("isRemembered",false); editor.remove("password"); } editor.apply(); } //记录登录历史 private void recordLoginHistory(int userId) { SQLiteDatabase db=userDb.getWritableDatabase(); ContentValues values=new ContentValues(); values.put(UserDatabase.COLUMN_USER_ID,userId); values.put(UserDatabase.COLUMN_DEVICE_INFO, Build.MODEL); db.insert(UserDatabase.TABLE_LOGIN_HISTORY,null,values); db.close(); } @Override protected void onActivityResult(int requestCode,int resultCode,Intent data){ super.onActivityResult(requestCode,resultCode,data); if(requestCode ==1 && resultCode==RESULT_OK && data!=null){ String username=data.getStringExtra("username"); main_Username.setText(username); } } @Override protected void onDestroy(){ userDb.close(); super.onDestroy(); } }为什么我的记住密码功能不实现
07-12
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值