【发布时间】:2018-07-13 13:50:40
【问题描述】:
我有多个在活动内部的片段。我在片段onActivityCreate 方法中调用了myAdapter。
我已经阅读了太多关于领域性能改进、适配器管理、领域使用的文章。我在简历中打开领域并在暂停中关闭它。但有时我的领域适配器显示为空。当我删除closeRealm 方法时,我的适配器运行正常。
我的错误是因为不同适配器的 openRealm 和 closeRealm 重叠。
第一个适配器正在打开-> openRealm--onCreate (时间: 21:15) 关闭->closeRealm--onPause (时间: 21:30:12)
第二个适配器正在打开 -> openRealm--onCreate (时间: 21:30:23) :: 上面的适配器正在关闭这个领域
https://realm.io/docs/java/latest/#configuring-a-realm :重要的是要注意 Realm 实例是线程单例,这意味着静态构造函数将返回相同的实例以响应来自给定线程的所有调用。
我可以管理领域线程的领域,但不能管理 ui 线程。如何为 ui 线程同时创建不同的领域实例?请帮帮我。
领域适配器:
abstract class MyRealmRecyclerViewAdapter<T extends MyModel, VH extends RecyclerView.ViewHolder>
extends RealmRecyclerViewAdapter<MyModel, VH> {
protected Context context;
private String TAG = MyRealmRecyclerViewAdapter.class.getSimpleName();
protected Realm realm;
MyRealmRecyclerViewAdapter(@Nullable OrderedRealmCollection<T> data, Realm realm) {
super((OrderedRealmCollection<MyModel>) data, true, true);
if (data != null && !data.isManaged()) {
throw new IllegalStateException("Only use this adapter with managed RealmCollection, " +
"for un-managed lists you can just use the BaseRecyclerViewAdapter");
}
setRealm(realm);
setHasStableIds(true);
}
}
我的片段:
public class MyFragment extends Fragment {
private boolean isRealmAssignee = false;
private Realm realm;
@Override
public void onActivityCreated(Bundle bundle) {
super.onActivityCreated(bundle);
Mylog.i(TAG, " onActivityCreated");
try {
myAdapter = new MyRealmRecyclerViewAdapter<>(this,
new MyQueries().getAllItems(getRealm()),getRealm());
recyclerView.setAdapter(myAdapter);
} catch (Exception e) {
Mylog.printStackTrace(TAG + " initializeListAdapter error", e);
}
}
@Override
public void onResume() {
super.onResume();
Mylog.i(TAG, " onResume");
setRealm();
}
@Override
public void onPause() {
super.onPause();
Mylog.i(TAG, " onPause");
closeRealm();
}
public void setRealm() {
if (!isRealmAssignee && !RealmManager.checkRealm(realm)) {
this.realm = RealmManager.open();
isRealmAssignee = true;
}
}
public Realm getRealm() {
if (!RealmManager.checkRealm(realm)) {
isRealmAssignee = false;
setRealm();
}
return realm;
}
public void closeRealm() {
RealmManager.close(realm);
isRealmAssignee = false;
}
领域经理:
public class RealmManager {
public synchronized static Realm open() {
return Realm.getDefaultInstance();
}
public synchronized static void close(Realm mRealm) {
if (checkRealm(mRealm)) {
mRealm.close();
}
}
public static boolean checkRealm(Realm realm) {
return realm != null && !realm.isClosed();
}
}
【问题讨论】:
-
我不确定您阅读了哪些有关 Realm 性能的文章,但 realm.io/docs/java/latest/#realm-instance-lifecycle 就足够了。
-
请查看我编辑的问题并分享多个适配器的使用领域示例
-
对于您的用例,我推荐这种方法:github.com/Zhuinden/realm-monarchy/tree/…
标签: android realm realm-list realmrecyclerviewadapter