将复杂数据结构传递给片段或活动的好策略

时间:2013-05-28 03:02:49

标签: android

目前,为了将复杂的数据结构传递给片段或活动,我使用http://developer.android.com/guide/faq/framework.html#3描述的策略

  

您还可以使用WeakReferences的HashMap与Long对象   键。当一个活动想要将一个对象传递给另一个活动时,它就是   只需将对象放入地图并发送密钥(这是唯一的   基于计数器或时间戳的长期通过收件人活动   意图额外。收件人活动使用此检索对象   键。

我使用Application来保存全局可访问的HashMap,并使用以下代码通过Long键发送。

public class MyFragment extends Fragment {

    public static MyFragment newInstance(long myArrayId) {
        // This is how I receive the object Id.
        MyFragment myFragment = new MyFragment();
        Bundle bundle = new Bundle();
        bundle.putLong(MyApplication.INTENT_EXTRA_MY_ARRAY_ID, myArrayId);
        myFragment.setArguments(bundle);
        return myFragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // This is how I turn Id into Object.
        this.myArrayIdId = this.getArguments().getLong(MyApplication.INTENT_EXTRA_MY_ARRAY_ID);
        this.myArray = (MyArray)MyApplication.instance().getExtra(myArrayIdId );

我首先认为这是一个非常好的策略。特别是对于那些看似不可能的复杂数据结构,使用Parcelable实现。

此策略非常适用大部分时间。但是,有一种情况是它不起作用。我发现,如果系统没有被激活一段时间,系统可能会销毁Application

这是重现问题的方法。

  1. 运行您的应用
  2. 按主页
  3. 运行其他内存密集型应用程序,按Home键,再次运行其他应用程序。
  4. 长按主页按钮。您的应用仍应显示在列表中。
  5. 选择它。您将意识到对象HashMap是空的。 (紧随应用程序崩溃,因为我们得到null对象)
  6. 我知道其中一个可靠的解决方案是避免将对象存储在静态HashMap中,但将它们放在Bundle中Parcelable

    但是,如果情况不可能将类放在Parcelable,因为它们有文件句柄,线程句柄,并发数据结构,......解决这个问题的策略是什么?

    我知道提出了很多类似的问题。但似乎没有给出好的解决方案。 (请参阅,即使谷歌自己的常见问题解答也忘记提及在静态HashMap中存储并不能一直工作)

0 个答案:

没有答案