【问题标题】:Android Fragments - where to save the state ( linked list with custom objects) ?Android Fragments - 在哪里保存状态(带有自定义对象的链表)?
【发布时间】:2016-08-24 09:04:35
【问题描述】:

在我的应用程序中,当用户从片段 1 转到片段 2 时,我有一个活动和 9 个片段始终被替换并保留在后台堆栈中,片段 1 的方法 onDestroyView 被调用并在那里我清理所有文件(我有一个很大的链表,里面有一些自定义对象)和其他对象,如果我将它们保存在内存中,则会抛出 OutOfMemory 异常。

我应该在哪里存储该列表?在数据库中?在共享偏好中(在这里我看到你需要做一些技巧才能使它成为可能)。 起初我想将它们存储在 onSaveInstanceState 方法提供的包中,但该方法永远不会被调用,因为它对于充当所有片段的“容器”容器的 Activity 来说是紧密的。

而且我认为与 OnSaveInstanceState 相关并不是 Fragment 内的一个好习惯(对于我需要的)。因此,在暂停时,我会清理所有字段,并且应该将它们存储在重新创建片段的位置和时间,并取回所有变量并在用户离开时创建视图。 (例如将位置保留在回收站视图中等等......)

我对此进行了很多搜索,但没有找到任何具体的答案。

所以说清楚一点,问题如下:

在 android 中保存 Fragments 状态的最佳做法是什么(来自回收站视图的位置 + 正在显示的对象列表 + 其他字段)?我应该使用存储所有字段或 SharedPreferences 的数据库吗?还是有其他我没有提到/找到的方法?

我主要关心的是 android 在这个主题和性能方面的最佳实践。

【问题讨论】:

  • 如果你只想维护所有片段的状态而不是替换片段尝试addremove操作,状态将自动保留。您无需执行任何操作。
  • 是的,但是这样做我会在某个时候得到 OutOfMemory 异常,这就是我试图避免的......
  • 为此将您的数据保存在数据库中,如果适用,请尝试CursorAdapter,它非常适合从数据库中有效加载数据集,或者只需使用Loaders
  • 您也可以尝试在您的应用程序中设置android:largeHeap="true"。虽然如果你能避免它不是最好的。

标签: android database performance android-fragments android-sqlite


【解决方案1】:

经过更多研究,(总而言之)我发现关于这个问题的最佳实践是使用数据库,如果您存储了重新创建片段所需的所有属性。 关于数据库,我阅读了我研究过的 REALM 库,我发现它是一个非常易于使用且非常复杂的库。

在此处查看更多详细信息: https://realm.io/docs/java/latest/

【讨论】:

    【解决方案2】:

    这可能会有所帮助。 Android Developer Parceable您可以使自定义对象扩展 Parceable。尝试寻找Android Parceable example 2

    【讨论】:

    • 是的,但问题是在哪里存储它们?
    【解决方案3】:

    您可以将 TabHost 与片段一起使用,它会自动维护状态 这是我的 Main2Activity 代码

        public class Main2Activity extends AppCompatActivity {
    private FragmentTabHost mTabHost;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
        mTabHost.setup(this, getSupportFragmentManager(), android.R.id.tabcontent);
    
        mTabHost.addTab(
                mTabHost.newTabSpec("tab1").setIndicator("Tab 1", null),
                Tab1Fragment.class, null);
        mTabHost.addTab(
                mTabHost.newTabSpec("tab2").setIndicator("Tab 2", null),
                Tab2Fragment.class, null);
        mTabHost.addTab(
                mTabHost.newTabSpec("tab3").setIndicator("Tab 3", null),
                Tab3Fragment.class, null);
    
    }}
    

    这是我的 activity_main2.xml

    <android.support.v4.app.FragmentTabHost
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@android:id/tabhost"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" >
    
    
    
            <FrameLayout
                android:id="@android:id/tabcontent"
    
                android:layout_width="fill_parent"
                android:layout_height="0dp"
                android:layout_weight="1" />
            <TabWidget
                android:id="@android:id/tabs"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="bottom"/>
        </LinearLayout>
    
    </android.support.v4.app.FragmentTabHost>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-30
      • 2016-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-27
      • 2016-11-09
      相关资源
      最近更新 更多