使用静态变量在包中的活动之间共享数据

时间:2014-08-24 18:16:42

标签: java android static android-bundle

所以基本上,我不能动摇这似乎是一个坏主意的事实,但我无法确定原因。

我在Activity A中有Activity BPackage 1Activity A进行了一次Volley调用并创建了一个包含一些简单数据的模型Model X列表(字符串)和原始人)。举一个非常简单的例子,让Model X代表一篇新闻文章(因此模型列表是新闻文章列表),其中包含新闻文章的标题和正文。 Activity A包含一个显示文章标题的列表。当您单击列表中的项目时,将调用Activity B并且文章的标题显示在顶部,文章的正文如下所示。除Activity B之外的任何地方都无法调用Activity A,并且只有在A检索到Model X之后才能调用Activity B现在让我们说我们有大量这些模型都包含大量简单类型并且您无法确定模型Model X需要哪些数据,您只需知道它需要Activity A中检索到的Activity A

"正确"看来,步骤似乎是让模型实现Parcelable并将模型捆绑传递给活动。关键在于我有很多拥有大量数据的模型,如果我能节省时间,那就太棒了。我试图实现某种通用的parceler,这变得一团糟。所以这就是我的想法:

  

Activity B可以将onItemClick()中选择的模型保存为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(); } }; } } 可以使用的受保护静态变量,而不必在parceled bundle中传递它,因为一旦模型生成,它将会是模型的唯一实例,模型不会以任何方式改变,因此模型的状态不会被静态调用中断?

像这样的东西

活动A

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
    }
}

活动B

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的应用程序中仍然是持久的,或者应用程序已重新启动,用户必须经过{ {1}}重建我们的排球Model,以便Activity B也可以使用它。 (这里需要逻辑检查可能出错)

我确实知道volley有一个缓存,但我相当肯定它需要正确的缓存头(它给出类似于304的响应代码),这是我没有得到的。对此的任何意见也表示赞赏。而且,我再次意识到使用静力学并不是完全理想的,但我真的想弄清楚为什么它们不应该在这种情况下使用,或者这实际上是它们的用途之一。 / p>

1 个答案:

答案 0 :(得分:1)

这是一篇很好的博客,解释了细节,但如果你确实想在静态变量中存储一些数据,最好的办法就是在aplication类中加入这个变量,但即便如此也存在缺陷。例如,您的活动可能暂停,然后使用应用程序的新实例恢复,您的数据将会消失(因此在某个对象上调用方法可能会给您一个NPE。我认为它更安全要么使用可解析的,要么将其保存到一个活动中的sharedperferences中,然后在下一个活动中加载它。

以下是我提到的博客,如果您继续将数据存储在静态变量中以便在活动之间传递,那么可能会解释您认为可能出现问题的原因。

http://www.developerphil.com/dont-store-data-in-the-application-object/