Java 使用静态变量在包内的活动之间共享数据
所以基本上,我不能否认这似乎是个坏主意,但我真的不能确定为什么 我有Java 使用静态变量在包内的活动之间共享数据,java,android,static,android-bundle,Java,Android,Static,Android Bundle,所以基本上,我不能否认这似乎是个坏主意,但我真的不能确定为什么 我有活动A和活动B在Package 1和活动A中进行了一次截击,并创建了一个包含一些简单数据(字符串和原语)的模型列表Model X。举一个非常简单的例子,让modelx表示一篇新闻文章(因此模型列表就是新闻文章列表),其中包含一篇新闻文章的标题和正文活动A包含显示文章标题的列表。单击列表中的某个项目时,将调用活动B,文章标题显示在顶部,正文显示在下面活动B只能从活动A的任何位置调用,并且只有在A检索到模型X之后,现在让我们假设我们
活动A
和活动B
在Package 1
和活动A
中进行了一次截击,并创建了一个包含一些简单数据(字符串和原语)的模型列表Model X
。举一个非常简单的例子,让modelx
表示一篇新闻文章(因此模型列表就是新闻文章列表),其中包含一篇新闻文章的标题和正文<代码>活动A包含显示文章标题的列表。单击列表中的某个项目时,将调用活动B,文章标题显示在顶部,正文显示在下面<代码>活动B只能从活动A
的任何位置调用,并且只有在A检索到模型X
之后,现在让我们假设我们有大量这些模型,它们都包含大量简单类型,并且您无法确切确定模型活动B
需要哪些数据,您只知道它需要在活动A
中检索到的型号X
“正确”的步骤似乎是让模型实现Parcelable,并将模型打包传递给活动。问题是,我有很多模型,有很多数据,如果我能节省时间,那就太好了。我试图实现某种通用的包裹器,结果弄得一团糟。下面是我的想法:
活动A
是否可以将在onItemClick()中选择的模型保存为受保护的静态变量,活动B
可以使用,而无需将其以打包包的形式传递,因为一旦创建了模型,它将是模型的唯一实例,并且不会以任何方式更改模型,因此静态调用不会中断模型的状态
像这样的
活动A
public class A extends Activity implements OnItemClickListener{
private List<X> mModels;
protected static X mModel;
private SimpleListAdapter mAdapter;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
// code
if(mModels == null)
requestModels();
else
buildInitialList();
}
@Override
public void onItemClick(AdapterView<?> parent, View child, int position, long id){
mModel = mAdapter.getItem(position); // <-- returns Model X in list of models
startActivity(new Intent(this, B.class));
}
/*
Some irrelevant code, including requestModels() network call (I have a
NetworkManager class that does that, but again it isn't important how it
does that, just important how I get my data) as well as building my list.
*/
// Listener attached to Volley call for response
private Listener<ArrayList<Model>> getVolleyListener(){
return new Listener<ArrayList<Model>>(){
@Override
public void onResponse(ArrayList<Model> models) {
if(models != null){
mModels = models;
buildInitialList();
}
else
closeOnEmptyList();
}
};
}
}
活动A和活动B之外永远不会使用模型类X,需要使用相同类型模型的每个活动都放在同一个包中
。我有很多类做类似的事情(新闻文章、流行的问答、法律细节,大部分只是其他通用字符串数据)。我可以把所有不成问题的东西都打包起来,我只是无法指出这件事到底是怎么回事,尽管它似乎有缺陷。所有数据都不需要任何安全性,而且所有模型都不足以导致静态堆内存问题
编辑
我的情况并不特别,但有点不寻常。我同意我的数据必须在应用程序重新启动时重新注册。这意味着(据我所知)如果我在活动A中静态存储受保护类型的模型,活动B中的模型不可能为空,因为静态变量仍然从暂停的活动A持续存在于应用程序中,或者应用程序已经重新启动,用户将必须通过活动A
重建凌空模型
,以便活动B
我也可以用它。(此处需要逻辑检查时可能出错)
我确实意识到volley有一个缓存,但我相当肯定它需要正确的缓存头(提供类似304的响应代码),而我没有得到。在此方面的任何意见也将不胜感激。再一次,我意识到使用静态并不理想,但我真的想弄清楚为什么不应该在这种情况下使用它们,或者这是否是它们的实际用途之一。这里是一个很好的博客,解释了细节,但是如果您确实想在静态变量中存储一些数据,您最好的选择是在应用程序类中使用该变量,但即使这样也存在陷阱。例如,您的活动可能会暂停,然后使用应用程序的新实例继续,而您的数据可能会丢失(因此,对某个对象调用方法可能会给您一个NPE。我认为使用parable或将其保存到一个活动中的sharedperferences并在下一个活动中加载它更安全
这是我提到的博客,它可能解释了如果您继续将数据存储在静态变量中以在活动之间传递,您可能会觉得有些问题的原因
活动A中的数据从何处加载?@user3249477我有一个网络调用,它会在侦听器中返回。我将添加侦听器只是为了显示它来自何处。啊,没关系。我想如果数据是静态的,你可以将其保存在数据库中。然后每个活动都可以从数据库中获取它需要的项目@user3249477是的,我知道,谢谢你的输入。我只是想知道,如果这个代码有什么问题的话。看起来里面一定有个洞,我就是找不到,真诚地希望没有一个原因可以让我的生活更轻松。哈哈。你的应用程序的模型应该是静态存储的,但应该是分开的从UI代码,根据。这将确保数据的持久性,即使UI发生更改,例如由于配置更改而重新创建的活动
。然后,您只需将特定模型的id引用传递给详细信息活动
,它就可以从静态数据中获取数据。我相信Volley已经实现了输入一个静态缓存,这样您就可以重新查询它并从响应中检索所需的模型。根据我的问题,这是一个完全可以接受的答案。我得出的结论是,我的情况非常独特,在这种情况下,可能会使用静态变量,尽管不理想。基于以下事实,数据pull是如此频繁和随机地更改,我可以在onResume()上做一个简单的检入,如<
public class B extends Activity{
private X mModel;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//code
this.mModel = A.mModel;
doSomethingWithModel();
}
private void doSomethingWithModel(){
String title = mModel.title;
String body = mModel.body;
// do something
}
}