Android:静态变量和移动复杂数据

时间:2017-03-01 20:05:37

标签: java android multithreading variables static

如果我有一个包含静态变量的类,请说x:

class MyClass {

    static boolean x = false;

    // Other methods

}

现在让我们说,假设我从第一个活动中设置了x = true;。在我的应用程序生命周期的其余部分(包括各种活动和线程)中,由于“Google JVM”或Android环境的工作方式,这个值很容易被“重置”回false,是否有任何意义?我听说静态变量有一个“生命周期”,当程序死亡时就会死掉。活动算作单独的“程序”吗?服务怎么样?甚至小部件?

我之所以这样问是因为由于“分离”的活动是如何进行的,因此通常很难共享依赖于其他复杂处理(如从在线数据库同步数据)的复杂数据结构,而静态变量通常非常快速而肮脏的解决方案。我尝试过的其他内容包括序列化,但这看起来并不像是一个实际的解决方案(当用户从​​一个活动导航到另一个活动时,不断地序列化和解码对象似乎会非常耗费资源)。

如果我这样做是一个邪恶的人,请告诉我我做错了什么,甚至更好,给我一些链接或更好的方法来解决这个问题。

4 个答案:

答案 0 :(得分:1)

Yes. There are times where that will reset.主要是如果用户离开应用并开始摆弄其他应用,或者用户让手机长时间进入睡眠状态。 Android进程可能会杀死实际的应用程序。那么"状态"当用户回来时,应用程序将被恢复,但是静态变量将是默认值,因为实际过程已重建。

通常,在活动和服务之间传递小对象是通过覆盖Parcelable接口来完成的。这将允许您使用活动,视图和某些适配器的setOnInstanceState方法保存和恢复对象。他们同样会有一个恢复方法,您可以在其中重建对象。 Parcelable优于Serializable。

较大的数据可能需要共享文件或数据库,具体取决于您要同步的数据。在活动之间传递的parcelables有1 MB大小限制。一种常见的策略是将信息保存到文件中,并将URI发送到可以检索信息的位置。

答案 1 :(得分:1)

回答你的问题 - 是的,当你设置x = true时会出现这种情况,并且值将被重置'回到假。好吧,不完全重置但考虑这种情况:你有一个活动和一个服务。服务正在使用单独的流程(您可以在声明服务时在AndroidManifest中定义该流程)。然后,这两个进程(主应用和服务)不会共享内存,并且在您的活动中将x设置为true将不会影响服务中MyClass.x的值。在所有其他情况下,在一个地方改变价值将在其他地方可见。希望它有所帮助!

答案 2 :(得分:0)

不,除非您更改静态变量或应用程序结束,否则不会更改静态变量,使用它是安全的(但通常是不清洁的)。关闭变量所存在的活动不会伤害它。

您建议您在活动中移动时需要跟踪值。在这种情况下,您可以将Intents中的值添加为所谓的“额外”值。如果你还需要传回后面的值,an​​droid也有startActivityForResult功能

Intent extras示例:

下面的

x可以是任何类型的值,包括实现Parcelable

的任何对象
Intent intent = new Intent(...);
intent.putExtra("myKey", x); 
startActivity(intent);

接收课程:

x = getIntent().getBooleanExtra("myKey");

修改

鉴于您的附加注释 - “包含更多对象列表的对象列表”,您在尝试使用附加内容时可能会遇到包裹太大的异常,但这表明您有更大的架构问题并且可能存在更好的方法

答案 3 :(得分:0)

使用Gson。 Gson是一个Java库,可用于将Java对象转换为其JSON表示。它还可用于将JSON字符串转换为等效的Java对象。 Gson可以处理任意Java对象,包括你没有源代码的预先存在的对象。

您有两种选择。转换为字符串,然后将数据放入intent中,然后传递给activity。或者使用gson转换为字符串,保存为首选项,然后在其他活动中,检查首选项是否存活并从中读取。

如果你想大胆,你可以坚持使用Realm for Android或者ObjectBox是一个针对性能优化的新移动对象数据库。使用ObjectBox,我们将NoSQL服务器数据库的技术引入移动。