目前,要将复杂的数据结构传递给片段或活动,我正在使用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
,如果一段时间未激活,系统可能会破坏。
这是重现问题的方法。
- 运行你的应用
- 新闻主页
- 通过运行其他内存密集型应用程序,按 Home,再次运行其他应用程序来运行它们。
- 长按主页按钮。您的应用仍应出现在列表中。
- 选择它。你会意识到这个对象
HashMap
是空的。(随着应用程序崩溃,我们得到空对象)
我知道可靠的解决方案之一是避免将对象存储在 static 中HashMap
,而是将它们放在 Bundle as 中Parcelable
。
但是,如果无法将类设置为Parcelable
,因为它们具有文件句柄、线程句柄、并发数据结构……克服这个问题的策略是什么?
我知道已经提出了很多类似的问题。但似乎没有给出好的解决方案。(看,即使是谷歌自己的常见问题解答也忘了提到存储在静态 HashMap 中并不总是有效)