Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 在应用程序生命周期中将值存储在内存中的替代方法_Performance_Android Activity_Android - Fatal编程技术网

Performance 在应用程序生命周期中将值存储在内存中的替代方法

Performance 在应用程序生命周期中将值存储在内存中的替代方法,performance,android-activity,android,Performance,Android Activity,Android,我有一个从用户那里获取位置信息的应用程序,它需要消耗电池,频繁请求位置是完全不可取的,因为除非用户手动刷新,否则该应用程序只需要1次 所以问题是,我注意到,有时即使我将其存储在onSave中并在onCreate中还原,该值也是空的,所以垃圾收集器正在执行它的作业,应用程序使用位图分配,方向也可能发生变化,所以我认为这并不奇怪,现在我正在考虑对应用程序进行子类化,以保持对位置变量的全局引用,但有几个人反对这种做法,主要是反对静态变量,所以我想知道是否有其他选择。在SharedReferences中

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

所以问题是,我注意到,有时即使我将其存储在onSave中并在onCreate中还原,该值也是空的,所以垃圾收集器正在执行它的作业,应用程序使用位图分配,方向也可能发生变化,所以我认为这并不奇怪,现在我正在考虑对应用程序进行子类化,以保持对位置变量的全局引用,但有几个人反对这种做法,主要是反对静态变量,所以我想知道是否有其他选择。在SharedReferences中存储值对我来说似乎不是一个好的/干净的/快速的选项,更不用说磁盘了,因为如果应用程序被破坏,位置就不重要了,它只在应用程序运行并且避免垃圾收集器时起作用

谢谢

保存价值

@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

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


你当然不需要把它放在SharedReference中,除非你想让它在两次应用调用之间存活下来。对于位置数据,这几乎肯定不是您想要的。

添加了我的保存和恢复方法以及发生的错误sometimes@Motheus您是否尝试在SaveInstanceState中签入您要放入的位置始终为非空?以及检查还原的mCurrentLocation是否为null?在接收到位置后,它不应为null,因为这是某些函数的要求,并且在获取后不会再次修改。这是需要运行的,因此此时不可能从代码中获取空位置或从未检索到。这就是为什么我猜测垃圾收集器在onSave之前/之后使用它,这样代码段有时就不会到达它