如何知道共享偏好何时完成写作

时间:2015-05-31 03:15:46

标签: android sharedpreferences

我有两项活动。活动A有一个按钮,它启动活动B.当您点击活动B中的后退按钮时,它会重新启动活动A.此外,当后退按钮被点击时,它会转到活动B的onStop方法,此时我更新了共享的首选项。用户。基本上我将播放器数据存储在共享首选项上,但问题是当活动A重新启动时我还加载了相同的共享首选项,但它没有显示我在活动B停止时保存的更新数据。我重新加载应用程序,它显示了最新的数据。因此,似乎在活动B停止时保存它时,没有足够的时间在活动A重新启动时加载它。那么如何判断共享首选项是否已完成写入?基本上我想加载共享首选项一旦我知道共享首选项已更新,这可能吗?

我正在使用提交方法:

@Override
protected void onStop() 
{
    Long dist = (long)treadmill_.Mod.distance_;
    Long newdist = dist + PlayerInfoManager.getInstance().getDistanceTraveled();
    PlayerInfoManager.getInstance().setDistanceTraveled(newdist);

    float fastestSaved = PlayerInfoManager.getInstance().getFastestSpeedAcheived();
    float fastestInSess = treadmill_.Mod.fastestSpeed;
    if(fastestSaved<fastestInSess)
        PlayerInfoManager.getInstance().setFastestSpeedAcheived(fastestInSess);

    Long time = (long)treadmill_.Mod.time_;
    Long newTime = time + PlayerInfoManager.getInstance().getTotalTimeRan();
    PlayerInfoManager.getInstance().setTotalTimeRan(newTime);

    Log.e("OnStop", "at Run, run, run");
    super.onStop();
}

在PlayerInfoManager.getinstance()。setDistanceTraveled(newdist):

public void setDistanceTraveled(Long distanceTraveled) 
{
    DistanceTraveled = distanceTraveled;
    Editor edit = SP.edit();
    edit.putLong("DistanceTraveled", distanceTraveled);
    edit.commit(); 
}

SP是sharedPreference实例:

private SharedPreferences SP;

重新启动时的活动A:

@Override
protected void onRestart() {
    super.onRestart();
    LoadStats();
    Log.e("onrestart", " ");
}

public void LoadStats()
{
    PIM.loadAll();
    Dis.setText(Long.toString(PIM.getDistanceTraveled()));
    FastestSpeed.setText(Float.toString(PIM.getFastestSpeedAcheived()));
    TotalTime.setText(Long.toString(PIM.getTotalTimeRan()));
    KeepItUp.setText(Long.toString(PIM.getLongestTimeInKeepItUp()));
}

    public void loadAll()
{// load all saved player data from sharedpreferences
    DistanceTraveled = SP.getLong("DistanceTraveled", 0L);
    FastestSpeedAcheived = SP.getFloat("FastestSpeed", 0.0f);
    TotalTimeRan = SP.getLong("TotalTime", 0L);
    LongestTimeInKeepItUp = SP.getLong("KeepItUp", 0L);
}

2 个答案:

答案 0 :(得分:0)

使用.commit()方法可确保您的数据已保存。 请参阅android doc以获取sharedPreferences。

see the commit and apply method

答案 1 :(得分:0)

请使用onPause,因为这发生在onStop

之前

来自文档

  

系统即将开始恢复上一个活动时调用。这通常用于提交未保存的持久数据更改,停止动画以及可能消耗CPU等的其他事情。此方法的实现必须非常快,因为在此方法返回之前,下一个活动将不会恢复。

您可能希望查看Activity's lifecycle的说明。