Android Studio(Java):如何用SharedPreferences保存ProgressBar进度
问题:App销毁后ProgressBar进度无法保存,TextView正常
已尝试数小时,希望实现关闭或销毁App后仍能保存ProgressBar的进度。该方法在TextView上可正常运行,但在ProgressBar上失效,想排查问题所在,以下是我的代码:
public class MainActivity extends AppCompatActivity { public static final String PROGRESS = "progress"; private int CurrentProgress; private ProgressBar progressBar; private Button addProgress; public static final String SHARED_PREFS="sharedPrefs"; private int getCurrentProgress; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); progressBar = findViewById(R.id.progressBar); addProgress = findViewById(R.id.addProgress); progressBar.setMax(1000); addProgress.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { CurrentProgress = CurrentProgress + 100; progressBar.setProgress(CurrentProgress); saveData(); } }); loadData(); updateData(); } public void saveData(){ SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putInt(PROGRESS, CurrentProgress); editor.apply(); } public void loadData() { SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE); getCurrentProgress = sharedPreferences.getInt(PROGRESS, CurrentProgress); } public void updateData() { progressBar.setProgress(CurrentProgress); } }
问题排查与修复方案
核心问题
代码存在变量赋值不匹配的错误:
- 在
loadData()方法中,从SharedPreferences读取的进度值被赋值给了getCurrentProgress变量,但后续更新ProgressBar的updateData()方法使用的是CurrentProgress,导致保存的进度根本没有被加载到ProgressBar上。 loadData()中默认值使用CurrentProgress(初始为0)虽然逻辑上可行,但显式指定0更清晰。
修复代码
修改loadData()方法即可解决问题:
public void loadData() { SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE); // 将读取的进度值赋值给CurrentProgress,而非getCurrentProgress CurrentProgress = sharedPreferences.getInt(PROGRESS, 0); } public void updateData() { progressBar.setProgress(CurrentProgress); }
说明
- 修正赋值对象后,App重启时会正确读取保存的进度值并赋值给
CurrentProgress,再通过updateData()设置到ProgressBar上。 - 显式指定默认值0,避免依赖成员变量的默认初始值,代码可读性更强。
内容的提问来源于stack exchange,提问作者K1non
相关产品推荐
相关产品推荐

