Android Studio Java开发静态整数变量丢失、跳转卡顿及日志报错问题
问题原因分析
- 静态变量被重置
核心有两个原因:- 你在
BeginAfter的onFinish方法中调用startActivity(new Intent(BeginAfter.this, Begin.class)),不是回退到已有的Begin实例,而是新建了一个Begin实例。如果应用触发过页面重建、后台被系统回收,静态变量num会被重新初始化为默认值1。 - 你只在点击按钮时把
num的值存入SharedPreferences,但从未在Begin的onCreate生命周期中读取存储的值赋值给num,每次新建Begin实例都会重置num为初始值。
- 你在
- 页面转场卡顿
反复调用startActivity启动新的Begin实例会导致Activity回退栈不断堆积实例,占用内存越来越高,同时新实例初始化需要走完整的页面创建流程,开销远高于回退到已有页面,自然会出现卡顿。 Unknown bits set in runtime_flags: 0x8000报错
这个日志是Android系统层面的输出,和你的业务代码无关,一般出现在特定版本的模拟器、定制ROM上,不会影响应用运行,无需处理。
修复方案
- 调整
BeginAfter的onFinish逻辑,不要新建Begin实例,直接调用finish()回到上一级已有的Begin实例即可:
@Override public void onFinish() { // 不要启动新的Begin实例,直接销毁当前页回到已有的Begin finish(); }
- 在
Begin的onCreate方法中添加从SharedPreferences读取存储值的逻辑,保证页面重建时num的值不会丢失:
@Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_begin); // 新增:读取SharedPreferences中存储的num值 sharedpreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE); String savedNum = sharedpreferences.getString(NUM, "1"); num = Integer.parseInt(savedNum); }
- 可选优化:如果需要避免
CountDownTimer内存泄漏,可以在BeginAfter的onDestroy生命周期中调用cancel()销毁计时器:
// 先把CountDownTimer声明为成员变量 private CountDownTimer countDownTimer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_begin_after); textView = findViewById(R.id.timer); long duration = TimeUnit.MINUTES.toMillis(1); countDownTimer = new CountDownTimer(duration, 1000) { // 原有onTick、onFinish逻辑保持不变 @Override public void onTick(long l) { String sDuration = String.format(Locale.ENGLISH, "%01d", TimeUnit.MILLISECONDS.toSeconds(l) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(l))); textView.setText(sDuration); } @Override public void onFinish() { finish(); } }.start(); } @Override protected void onDestroy() { super.onDestroy(); if (countDownTimer != null) { countDownTimer.cancel(); } }
内容的提问来源于stack exchange,提问作者user16240688
相关产品推荐
相关产品推荐

