SharedPreferences计数重置问题求助:Activity重启后计数器归零
问题分析与修复方案
嘿,我一眼就看到问题所在啦!你的核心问题是每次重启Activity时,counter都会被重新初始化为0,而且没有从SharedPreferences里加载之前保存的计数,导致新的点击会覆盖掉之前存储的数值。
为什么会出现这个问题?
你定义的int counter = 0;会在每次Activity创建时执行——也就是说,当你关闭再打开Activity,这个变量就会被重置为0。点击按钮时,你用这个新的0去递增,然后写入SharedPreferences,直接覆盖了之前保存的旧值。而Activity在前台时,counter一直保存在内存里,所以功能正常,一旦重启就“失忆”了。
修复步骤
我们需要做两个关键调整:
- 在Activity初始化时,先从SharedPreferences读取之前保存的计数,用来初始化
counter - 优化代码,避免重复获取SharedPreferences实例(没必要每次点击都重新获取)
修改后的完整代码示例
public class YourActivity extends AppCompatActivity { private int counter; private SharedPreferences shareOpenClose; private Button mBtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_activity_layout); // 替换成你的布局ID // 1. 提前获取SharedPreferences实例 shareOpenClose = getSharedPreferences("Counter", Context.MODE_PRIVATE); // 2. 从SharedPreferences读取之前的计数,没有的话默认0 counter = shareOpenClose.getInt("count", 0); mBtn = findViewById(R.id.your_button_id); // 替换成你的按钮ID mBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { counter++; // 写入最新计数到SharedPreferences SharedPreferences.Editor editor = shareOpenClose.edit(); editor.putInt("count", counter); editor.apply(); // 直接用counter判断即可,无需再次读取SharedPreferences if (counter > 3) { Toast.makeText(YourActivity.this, "success!", Toast.LENGTH_SHORT).show(); } } }); } }
额外优化说明
- 不用每次点击都重复调用
getSharedPreferences(),提前在onCreate里获取一次即可,减少不必要的资源消耗 - 写完SharedPreferences后,不需要再重新读取一次——因为
counter已经是最新的数值了,直接用它判断逻辑就行,避免多余的IO操作
内容的提问来源于stack exchange,提问作者ClassA
相关产品推荐
相关产品推荐

