在我的应用程序中,我有一个活动和9个片段,当用户从片段1转到片段2时,它们总是被替换并保存在后台堆栈中。片段1的方法onDestroyView被调用,在那里我清理了所有的文件(我有一个很大的链表,里面有一些自定义对象)和其他对象,如果我将它们保存在内存中,OutOfMemory异常将被抛出。
我应该把这个列表存储在哪里?在数据库里?在共享首选项中(我在这里看到你需要做一些修改才能实现)。起初,我想将它们存储在onSaveInstanceState方法提供的包中,但该方法从未被调用过,因为它与活动紧密相关,而活动只是充当所有片段的“容器”容器。
我认为在片段中关联OnSaveInstanceState并不是一个好的做法(对于我所需要的)。所以在on Pause中,我清理了所有的字段,我应该将它们存储在重新创建片段的地方,并在重新创建片段时获取所有变量,并在用户离开时创建视图。(例如将位置保留在回收器视图中,等等)
关于这一点我搜索了很多,没有找到任何关于这一点的具体答案。
因此,为了让问题变得更清楚,问题如下:
在android中,保存碎片状态(回收器视图中的位置+正在显示的对象列表+其他字段)的最佳实践是什么?我应该使用一个将存储所有字段的DB还是SharedPreferences?或者有没有其他我没有提到/发现的方法?
我主要关心的是android在这个问题上的最佳实践,以及性能。
发布于 2016-08-29 14:42:34
经过进一步的研究,(最后)我发现关于这个问题的最佳实践是使用数据库,因为您存储了重新创建片段所需的所有属性。关于数据库,我读到了一些领域库,我对它做了一些研究,我发现它是一个非常容易使用的库,也是一个非常复杂的库。
点击此处查看更多详情:https://realm.io/docs/java/latest/
发布于 2016-08-24 09:18:37
这可能会有所帮助。Android Developer Parceable您可以使自定义对象扩展为Parceable。尝试查找Android Parceable example 2
发布于 2016-08-24 09:23:05
您可以使用带有片段的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>
https://stackoverflow.com/questions/39118931
复制