我有多个在活动内部的片段。我在片段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();
}
}