【问题标题】:Alternative to store a value in memory during application lifecycle在应用程序生命周期中将值存储在内存中的替代方法
【发布时间】:2014-11-08 20:46:12
【问题描述】:

我有一个从用户那里获取位置信息的应用程序,并且会消耗电池,因此完全不希望频繁地请求位置信息,因为除非用户手动刷新,否则该应用程序只需要 1 次。

所以问题是,我注意到有时即使我将它存储在 onSave 并在 onCreate 中恢复它的值也是空的,所以垃圾收集器正在做它的工作(应用程序使用位图分配,方向变化也可能发生,所以我认为这并不奇怪),现在我正在考虑对应用程序进行子类化以保持对位置变量的全局引用,但有几个人反对这一点(主要是反对静态变量)所以我想知道是否有任何替代方案。在 SharedPreferences 中存储值对我来说似乎不是一个好的/干净/快速的选择,磁盘甚至更少,因为如果应用程序被销毁,位置并不重要,只要应用程序正在运行并避免垃圾收集器。

谢谢

保存价值

@Override
protected void onSaveInstanceState(Bundle outState) {

    super.onSaveInstanceState(outState);
    outState.putParcelable("mCurrentLocation", mCurrentLocation);
    ...
}

恢复价值:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null) {
        mCurrentLocation = savedInstanceState.getParcelable("mCurrentLocation");
        ...
    }
...

错误:

    Location location = ((mainActivity) mActivity).location;
    userLongitude = String.valueOf(location.getLongitude()); //null sometimes!, not always

【问题讨论】:

    标签: performance android-activity android


    【解决方案1】:

    您在 onSaveInstanceState()onRestoreInstanceState() 中做错了什么。应该很容易在其中存储和检索位置数据。毕竟,它只有几个字节。您要么没有正确地将其插入捆绑包中,要么没有正确地再次将其取出。

    您当然不需要将它放在 SharedPreferences 中,除非您希望它在应用程序的调用之间继续存在。而对于位置数据,这几乎肯定不是您想要的。

    【讨论】:

    • 添加了我的保存和恢复方式以及有时发​​生的错误
    • @Motheus 您是否尝试过在onSaveInstanceState 中检查您放入的位置始终为非空?并检查恢复的mCurrentLocation是否为空?
    • 位置接收到后不能为空,因为这是某些功能的要求,获取后也不会再修改。这是运行的要求,因此此时该位置不可能从代码中为空或从未检索到。这就是为什么我猜测垃圾收集器在 onSave 之前/之后采取了它,所以这段代码不会到达它有时
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 2019-05-24
    • 1970-01-01
    • 2020-04-27
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多