Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将复杂数据结构传递给片段或活动的良好策略_Android - Fatal编程技术网

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

Android 将复杂数据结构传递给片段或活动的良好策略,android,Android,目前,为了将复杂的数据结构传递给片段或活动,我使用 您还可以使用weakreference的HashMap来表示具有长字符串的对象 钥匙。当一个活动想要将一个对象传递给另一个活动时,它 只需将对象放入地图并发送密钥(这是唯一的 Long(基于计数器或时间戳)通过发送到收件人活动 意向附加条款。收件人活动使用此 钥匙 我使用Application保存全局可访问的HashMap,并使用以下代码跨长键发送 public class MyFragment extends Fragment {

目前,为了将复杂的数据结构传递给片段或活动,我使用

您还可以使用weakreference的HashMap来表示具有长字符串的对象 钥匙。当一个活动想要将一个对象传递给另一个活动时,它 只需将对象放入地图并发送密钥(这是唯一的 Long(基于计数器或时间戳)通过发送到收件人活动 意向附加条款。收件人活动使用此 钥匙

我使用
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
实现似乎是不可能的

这种策略在大多数情况下都非常有效。然而,在某些情况下,它不起作用。我刚刚发现,如果一段时间没有激活,系统可能会破坏
应用程序

这是如何重现问题的

  • 运行你的应用程序
  • 回家
  • 运行其他内存密集型应用程序,按Home键,然后再次运行其他应用程序
  • 长按主页按钮。您的应用程序仍应显示在列表中
  • 选择它。您将意识到对象
    HashMap
    是空的。(接下来是应用程序崩溃,因为我们得到空对象)
  • 我知道一个可靠的解决方案是避免将对象存储在静态
    HashMap
    中,而是将它们作为
    Parcelable
    打包

    但是,如果在这种情况下,不可能将类设置为可打包的,因为它们具有文件句柄、线程句柄、并发数据结构等等。。。克服这一问题的策略是什么


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

    克服这一问题的策略是什么在访问数据之前检查,如果数据已经可用,请使用它,如果没有,请再次检索它。问得好。我将尝试将存储在静态HashMap中的关键数据转换为JSON,并存储在首选项onPause和restore onResume中。这不是一个简洁的解决方案,但它可能会起作用。如果我需要传递的值只是原语或字符串,而且它非常重要,我会选择将其保存在数据库中。我更关心onPause,因为它很容易触发。(旋转,主按键…)静态哈希映射不会一直被清除。所以,经常运行磁盘I/O写操作来解决偶尔出现的问题是相当“浪费”的。有没有办法减少写操作的数量?我不太关心onResume,因为在决定磁盘I/O读取之前,我们可以检查数据是否为空。既然如此,为什么不将它放在onRestory中而不是onPause中呢?因为对象不是静态的,所以对象应该一直保留,直到活动被销毁。