我有一个使用普遍设计模式的安卓应用:
1. 主活动基本上呈现一组对象列表,小型设备上通过托管单个片段来显示此列表的recyclerview。在大型设备上,它托管两个片段,一个具有相同的对象recyclerview,另一个将在列表中选择一个对象时托管详细信息。
2. 在小型设备上,当从列表中进行选择时,会启动一个活动,该活动托管一个片段,利用ViewPager允许“滑动”浏览对象列表,并直接编辑每个对象。
在这两种情况下,用户只能从详细片段中进行编辑。
我当前已在应用程序类中初始化了我的realm实例,然后在我用于保存一些日常事务方法的活动基类中检索默认实例。
请注意,我将这个Realm实例存储在一个名为“ProfileLab”的静态类中:
我的问题是,将Realm实例保持打开状态是否会在整个应用程序的使用过程中造成问题?我在文档中注意到了这段话:
如果您从没有附加Looper的线程获取Realm实例,则此类实例的对象不会被更新,除非调用waitForChange()方法。需要注意的是,必须保留数据的旧版本会消耗大量内存和磁盘空间,并且随着被保留的版本数量增多,成本也会增加。这就是为什么在完成线程中使用完Realm实例后尽快关闭它的重要性所在。
问题在于,在UI线程上运行它是因为我还没有“完成”。 我不能仅出于原子更新而打开/关闭领域实例,因为我需要使用最初查询的结果来显示要选择进行编辑的对象列表-当我最初尝试时(我已将领域对象打开/关闭在ProfileLab中的每种方法中),我在我的回收站适配器中发现了一个错误,即realm已关闭…
显示RecyclerView的示例代码显示在各个活动级别检索/使用/关闭realm,如果我在两个简单活动之间执行此操作(托管RecyclerView和托管ViewPager),那么数据更新会在彼此之间反映出来吗?
1. 主活动基本上呈现一组对象列表,小型设备上通过托管单个片段来显示此列表的recyclerview。在大型设备上,它托管两个片段,一个具有相同的对象recyclerview,另一个将在列表中选择一个对象时托管详细信息。
2. 在小型设备上,当从列表中进行选择时,会启动一个活动,该活动托管一个片段,利用ViewPager允许“滑动”浏览对象列表,并直接编辑每个对象。
在这两种情况下,用户只能从详细片段中进行编辑。
我当前已在应用程序类中初始化了我的realm实例,然后在我用于保存一些日常事务方法的活动基类中检索默认实例。
public abstract class SingleFragmentActivity extends AppCompatActivity {
private Realm realm;
protected abstract Fragment createFragment();
@LayoutRes
protected int getLayoutResId() {
return R.layout.activity_fragment;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
realm = Realm.getDefaultInstance();
// Initialize ProfileLab
ProfileLab.get(realm);
setContentView(getLayoutResId());
FragmentManager fm = getSupportFragmentManager();
Fragment fragment = fm.findFragmentById(R.id.fragment_container);
if (fragment == null) {
fragment = createFragment();
fm.beginTransaction()
.add(R.id.fragment_container, fragment)
.commit();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if ( realm != null) {
realm.close();
}
}
}
请注意,我将这个Realm实例存储在一个名为“ProfileLab”的静态类中:
// Initialize ProfileLab
ProfileLab.get(realm);
在更新数据的各个片段中,我正在执行以下操作:
mProfile = ProfileLab.get().getProfile(profileId);
*
* do CRUD activities here for example:
*
private void deleteProfile() {
ProfileLab.get().deleteProfile(mProfile);
mCallbacks.onProfileUpdated(mProfile);
}
然后在ProfileLab中,它看起来像这样:
public boolean deleteProfile(Profile c) { boolean retVal = true;
try {
mRealm.beginTransaction();
c.deleteFromRealm();
} catch (Exception e) {
retVal = false;
} finally {
if ( mRealm != null ) {
if (retVal) {
mRealm.commitTransaction();
} else {
mRealm.cancelTransaction();
}
}
}
return (retVal);
我的问题是,将Realm实例保持打开状态是否会在整个应用程序的使用过程中造成问题?我在文档中注意到了这段话:
如果您从没有附加Looper的线程获取Realm实例,则此类实例的对象不会被更新,除非调用waitForChange()方法。需要注意的是,必须保留数据的旧版本会消耗大量内存和磁盘空间,并且随着被保留的版本数量增多,成本也会增加。这就是为什么在完成线程中使用完Realm实例后尽快关闭它的重要性所在。
问题在于,在UI线程上运行它是因为我还没有“完成”。 我不能仅出于原子更新而打开/关闭领域实例,因为我需要使用最初查询的结果来显示要选择进行编辑的对象列表-当我最初尝试时(我已将领域对象打开/关闭在ProfileLab中的每种方法中),我在我的回收站适配器中发现了一个错误,即realm已关闭…
显示RecyclerView的示例代码显示在各个活动级别检索/使用/关闭realm,如果我在两个简单活动之间执行此操作(托管RecyclerView和托管ViewPager),那么数据更新会在彼此之间反映出来吗?