Android 片段 - 在哪里保存状态(带有自定义对象的链表)?
Android Fragments - where to save the state ( linked list with custom objects) ?
在我的应用程序中,我有一个 activity 和 9 个片段,当用户从片段 1 转到片段 2 时,片段 1 的 onDestroyView 方法被调用并且我在那里清理所有文件(我有一个很大的链表,里面有一些自定义对象)和其他对象,如果我将它们保存在内存中,将抛出 OutOfMemory 异常。
我应该在哪里存储该列表?在数据库中?在共享首选项中(在这里我看到您需要进行一些修改才能使其成为可能)。
起初我想将它们存储在 onSaveInstanceState 方法提供的包中,但该方法从未被调用,因为它对 Activity 很紧,它充当所有片段的 "container" 容器。
而且我认为在 Fragment 中关联 OnSaveInstanceState 不是一个好的做法(对于我需要的)。所以在暂停时,我会清理所有字段,我应该将它们存储在重新创建片段的位置和时间,取回所有变量,并在用户离开时创建视图。 (比如将位置保持在回收站视图中等等..)
我对此进行了很多搜索,但没有找到任何具体的答案。
所以为了说清楚一点,问题如下:
android 中保存片段状态(回收站视图中的位置 + 正在显示的对象列表 + 其他字段)的最佳做法是什么?我应该使用将存储所有字段的数据库还是在 SharedPreferences 中?或者有没有其他方法我没有 mentioned/find ?
我主要关心的是 android 关于这个主题和性能的最佳实践。
这可能会有所帮助。 Android Developer ParceableYou can make the custom objects extend Parceable. Try lookin for Android Parceable example 2
您可以将 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>
经过更多的研究,(总而言之)我发现关于这个问题的最佳实践是使用数据库来存储重新创建片段所需的所有属性。
关于数据库,我阅读了 REALM 库,并对其进行了一些研究,我发现它是一个非常易于使用的库,但也非常复杂。
在此处查看更多详细信息:
https://realm.io/docs/java/latest/
在我的应用程序中,我有一个 activity 和 9 个片段,当用户从片段 1 转到片段 2 时,片段 1 的 onDestroyView 方法被调用并且我在那里清理所有文件(我有一个很大的链表,里面有一些自定义对象)和其他对象,如果我将它们保存在内存中,将抛出 OutOfMemory 异常。
我应该在哪里存储该列表?在数据库中?在共享首选项中(在这里我看到您需要进行一些修改才能使其成为可能)。 起初我想将它们存储在 onSaveInstanceState 方法提供的包中,但该方法从未被调用,因为它对 Activity 很紧,它充当所有片段的 "container" 容器。
而且我认为在 Fragment 中关联 OnSaveInstanceState 不是一个好的做法(对于我需要的)。所以在暂停时,我会清理所有字段,我应该将它们存储在重新创建片段的位置和时间,取回所有变量,并在用户离开时创建视图。 (比如将位置保持在回收站视图中等等..)
我对此进行了很多搜索,但没有找到任何具体的答案。
所以为了说清楚一点,问题如下:
android 中保存片段状态(回收站视图中的位置 + 正在显示的对象列表 + 其他字段)的最佳做法是什么?我应该使用将存储所有字段的数据库还是在 SharedPreferences 中?或者有没有其他方法我没有 mentioned/find ?
我主要关心的是 android 关于这个主题和性能的最佳实践。
这可能会有所帮助。 Android Developer ParceableYou can make the custom objects extend Parceable. Try lookin for Android Parceable example 2
您可以将 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>
经过更多的研究,(总而言之)我发现关于这个问题的最佳实践是使用数据库来存储重新创建片段所需的所有属性。 关于数据库,我阅读了 REALM 库,并对其进行了一些研究,我发现它是一个非常易于使用的库,但也非常复杂。
在此处查看更多详细信息: https://realm.io/docs/java/latest/