未加载SharedPreferences

时间:2019-07-05 16:43:05

标签: java android

我在物理设备(三星Galaxy J4 +)上测试了该应用程序。我打开它并输入数据(用于 SharedPreferences )。然后...

使用三星屏幕底部的“ <”按钮使应用程序界面消失后,点击应用程序图标时,

SharedPreferences 不加载,但是它们<使用“ |||”使应用程序界面消失后,点击应用程序图标时,strong>执行加载或三星屏幕底部的“ O”按钮。后者使我得出结论,保存和加载方法都可以正常工作。

加载方法(importSavedData())完全嵌入在MainActivity类内部的onCreate()方法中。该应用程序中没有其他活动生命周期方法 [onStart(),on Resume(),onPause()等)。

保存方法(saveData())每次将数据输入到应用程序时都会发生(通过按按钮发生),因此我认为没有必要在onStop中包含该方法()或onDestroy()方法。我确实尝试过在editor.apply()和editor.commit()之间切换,但无济于事。

public class MainActivity extends AppCompatActivity {

    int winnerA;
    int winnerB;

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

    public void importSavedData() {
       SharedPreferences savedData = getSharedPreferences("savedData", 
       Context.MODE_PRIVATE);
           winnerA = savedData.getInt("winnerA_SP", 0);
           winnerB = savedData.getInt("winnerB_SP", 0);
    }

    public void saveData(){         
       SharedPreferences savedData = getSharedPreferences("savedData", 
       Context.MODE_PRIVATE);
       SharedPreferences.Editor editor = savedData.edit();
           editor.putInt("winnerA_SP", winnerA);
           editor.putInt("winnerB_SP", winnerB);       
       editor.apply();
    }

    /* saveData() is executed when the user has changed
       the value of winnerA or winnerB by pressing one of the buttons in the 
       activity. */

 }

2 个答案:

答案 0 :(得分:0)

像这样覆盖onRestart()onResume()

@Override
public void onRestart() {
    super.onRestart();
    importSavedData();
}

@Override
public void onResume() {
    super.onResume();
    importSavedData();
}

因此,每次应用返回时,将从SharedPreferences中读取值。

答案 1 :(得分:0)

如果该应用只是进入后台,则它可能不会调用onDestroy,这意味着它返回时不会调用onCreate。将加载项放到onResume中,以使每次活动重新显示时都可以重新加载。看看Activity lifecycle

@Override
protected void onResume() {
    super.onResume();
    importSavedData();
}