0

所以基本上,我无法摆脱这似乎是个坏主意的事实,但我无法确定原因。

我进行了Volley 调用Activity A并创建了一个模型列表,其中包含一些简单的数据(字符串和原语)。举一个非常简单的例子,let表示一篇新闻文章(因此模型列表是新闻文章列表),其中包含新闻文章的标题和正文。包含显示文章标题的列表。当您单击列表中的某个项目时,将调用 并且文章的标题显示在顶部,文章的正文显示在下面。只能在 A 检索到之后才能从任何地方调用Activity BPackage 1Activity AModel XModel XActivity AActivity BActivity BActivity AModel X现在假设我们有大量这些模型,它们都包含大量简单类型,并且您不确定模型中Activity B需要什么数据,您只知道它需要Model XActivity 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 的响应代码),但我没有得到。对此的任何意见也表示赞赏。再一次,我意识到使用静态并不完全理想,但我真的想弄清楚为什么在这种情况下不应该使用它们,或者这实际上是它们的用途之一。

4

1 回答 1

1

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

这是我提到的博客,它可能解释了如果您继续将数据存储在静态变量中以在活动之间传递,您觉得可能出现问题的原因。

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

于 2014-08-24T20:47:19.343 回答