所以基本上,我无法摆脱这似乎是个坏主意的事实,但我无法确定原因。
我进行了Volley 调用Activity A
并创建了一个模型列表,其中包含一些简单的数据(字符串和原语)。举一个非常简单的例子,let表示一篇新闻文章(因此模型列表是新闻文章列表),其中包含新闻文章的标题和正文。包含显示文章标题的列表。当您单击列表中的某个项目时,将调用 并且文章的标题显示在顶部,文章的正文显示在下面。只能在 A 检索到之后才能从任何地方调用Activity B
Package 1
Activity A
Model X
Model X
Activity A
Activity B
Activity B
Activity A
Model X
现在假设我们有大量这些模型,它们都包含大量简单类型,并且您不确定模型中Activity B
需要什么数据,您只知道它需要Model X
在Activity A
.
看起来,“正确”的步骤是让模型实现 Parcelable 并将模型打包传递给活动。问题是我有很多模型和大量数据,如果我能节省时间,那就太好了。我试图实现某种通用的 parceler,结果变得一团糟。所以这就是我的想法:
无法
Activity A
将在 onItemClick() 中选择的模型保存为受保护的静态变量,Activity B
无需在打包的包中传递即可使用,因为一旦制作了模型,它将是模型的唯一实例,并且模型不会以任何方式改变模型的状态不会被静态调用破坏?
像这样的东西
活动一
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();
}
};
}
}
活动 B
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
}
}
The Model class X will never be used outside of Activity A and Activity B, and every Activity that needs to use a Model of the same type is placed in the same Package
. 我有许多类做类似的事情(新闻文章、热门问题和答案、法律细节,大部分只是其他通用字符串数据)。我可以打包所有不成问题的东西,即使它看起来有缺陷,我似乎也无法指出这有什么问题。没有任何数据需要任何安全性,也没有任何模型大到足以导致静态堆内存问题。
编辑
我的情况并非完全独特,但有点不常见。我可以在应用程序重新启动时取消我的数据。这意味着(据我所知)if I store the Model statically of the protected type in Activity A, there is no way that the Model could be null in Activity B
静态变量仍然在应用程序中从仍然暂停Activity A
或应用程序重新启动,并且用户将不得不Activity A
重新构建我们的 volleyModel
以便也Activity B
可以使用它。(此处需要逻辑检查中的可能错误)
我确实意识到 volley 有一个缓存,但我相当肯定它需要正确的缓存标头(提供类似 304 的响应代码),但我没有得到。对此的任何意见也表示赞赏。再一次,我意识到使用静态并不完全理想,但我真的想弄清楚为什么在这种情况下不应该使用它们,或者这实际上是它们的用途之一。