目前,为了将复杂的数据结构传递给片段或活动,我使用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
。
这是重现问题的方法。
HashMap
是空的。 (紧随应用程序崩溃,因为我们得到null对象)我知道其中一个可靠的解决方案是避免将对象存储在静态HashMap
中,但将它们放在Bundle中Parcelable
。
但是,如果情况不可能将类放在Parcelable
,因为它们有文件句柄,线程句柄,并发数据结构,......解决这个问题的策略是什么?
我知道提出了很多类似的问题。但似乎没有给出好的解决方案。 (请参阅,即使谷歌自己的常见问题解答也忘记提及在静态HashMap中存储并不能一直工作)