2

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

您还可以使用弱引用的 HashMap 到具有长键的对象。当一个 Activity 想要将一个对象传递给另一个 Activity 时,它只需将该对象放入映射中并通过 Intent Extras 将密钥(这是一个基于计数器或时间戳的唯一 Long)发送给接收者 Activity。接收者活动使用此键检索对象。

Application用来保存全局可访问的HashMap,并使用以下代码跨长键发送。

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是空的。(随着应用程序崩溃,我们得到空对象)

我知道可靠的解决方案之一是避免将对象存储在 static 中HashMap,而是将它们放在 Bundle as 中Parcelable

但是,如果无法将类设置为Parcelable,因为它们具有文件句柄、线程句柄、并发数据结构……克服这个问题的策略是什么?

我知道已经提出了很多类似的问题。但似乎没有给出好的解决方案。(看,即使是谷歌自己的常见问题解答也忘了提到存储在静态 HashMap 中并不总是有效)

4

0 回答 0