我正在尝试更新我的回收器 View ,以便当单击其中一项上的加号按钮时,该项目上的数量 TextView 会增加 1。
以下是适配器中点击监听器的代码。
holder.mQuantityPlusTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mEventBus.post(new CartQuantityPlusClickEvent(imgUrl));
notifyDataSetChanged();
}
});
这是订阅EventBus的 Activity 的代码。
@Subscribe(threadMode = ThreadMode.POSTING)
public void cartQuantityPlusClick(CartQuantityPlusClickEvent event) {
mClothingRepository.plusClothingCartQuantity(event.getImgUrl());
}
这是实际数量更新的代码。
@Override
public void plusClothingCartQuantity(String imgUrl) {
CartItem item = mRealm.where(CartItem.class).equalTo("imgUrl", imgUrl).findFirst();
mRealm.beginTransaction();
if (item != null)
item.increasQuantity(); Log.d(TAG, item.getQuantityInCart() + "");
mRealm.commitTransaction();
}
当我运行应用程序并按下按钮时。尽管与减少有效数量的代码完全相同,但数量没有发生变化。
这是减少数量的代码(适配器和事件总线的代码实际上是相同的)。
@Override
public void minusClothingCartQuantity(String imgUrl) {
CartItem item = mRealm.where(CartItem.class).equalTo("imgUrl", imgUrl).findFirst();
mRealm.beginTransaction();
if (item != null) {
if (item.getQuantityInCart() == DEFAULT_CART_ITEM_QUANTITY) {
item.deleteFromRealm();
} else
item.decreaseQuantity();
}
RealmResults<CartItem> cartItems = mRealm.where(CartItem.class).findAll();
if (cartItems.size() == 0)
mEventBus.post(new EmptyCartEvent());
mRealm.commitTransaction();
}
代码中用于增加数量的日志语句表示 item
变量为 null,并且:
12-29 12:25:31.881 21538-21538/com.geteven.gooddeal E/REALM_JNI: jni: ThrowingException 8, The Realm is already in a write transaction in /Users/cm/Realm/realm-java-release/realm/realm-library/src/main/cpp/io_realm_internal_OsSharedRealm.cpp line 126, .
12-29 12:25:31.882 21538-21538/com.geteven.gooddeal E/REALM_JNI: Exception has been thrown: The Realm is already in a write transaction in /Users/cm/Realm/realm-java-release/realm/realm-library/src/main/cpp/io_realm_internal_OsSharedRealm.cpp line 126
12-29 12:25:31.884 21538-21538/com.geteven.gooddeal E/EventBus: Could not dispatch event: class com.geteven.gooddeal.event.CartQuantityPlusClickEvent to subscribing class class com.geteven.gooddeal.view.CartActivity
java.lang.IllegalStateException: The Realm is already in a write transaction in /Users/cm/Realm/realm-java-release/realm/realm-library/src/main/cpp/io_realm_internal_OsSharedRealm.cpp line 126
at io.realm.internal.OsSharedRealm.nativeBeginTransaction(Native Method)
at io.realm.internal.OsSharedRealm.beginTransaction(OsSharedRealm.java:282)
at io.realm.BaseRealm.beginTransaction(BaseRealm.java:389)
at io.realm.Realm.beginTransaction(Realm.java:135)
at com.geteven.gooddeal.repository.ClothingRepository.plusClothingCartQuantity(ClothingRepository.java:145)
at com.geteven.gooddeal.view.CartActivity.cartQuantityPlusClick(CartActivity.java:190)
at java.lang.reflect.Method.invoke(Native Method)
at org.greenrobot.eventbus.EventBus.invokeSubscriber(EventBus.java:485)
at org.greenrobot.eventbus.EventBus.postToSubscription(EventBus.java:416)
at org.greenrobot.eventbus.EventBus.postSingleEventForEventType(EventBus.java:397)
at org.greenrobot.eventbus.EventBus.postSingleEvent(EventBus.java:370)
at org.greenrobot.eventbus.EventBus.post(EventBus.java:251)
at com.geteven.gooddeal.adapter.CartAdapter$3.onClick(CartAdapter.java:122)
at android.view.View.performClick(View.java:6289)
at android.view.View$PerformClick.run(View.java:24800)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6809)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
我从包含所有业务逻辑的存储库类的构造函数中获取 Realm 实例。
public ClothingRepository() {
mEventBus = EventBus.getDefault();
mRealm = Realm.getDefaultInstance();
mClothingRef = FirebaseDatabase.getInstance().getReference()
.child(FIREBASE_CLOTHING_REFERENCE);
}
我不关闭它,因为我不知道如何关闭。我觉得这可能是问题的一部分。我该如何解决这个问题?
最佳答案
在使用 Realm 之前,您应该始终获取 Realm 的实例。使用完毕后关闭实例。
@Override
public void plusClothingCartQuantity(String imgUrl) {
Realm realm = Realm.getDefaultInstance();
CartItem item = realm.where(CartItem.class).equalTo("imgUrl", imgUrl).findFirst();
realm.beginTransaction();
if (item != null)
item.increasQuantity(); Log.d(TAG, item.getQuantityInCart() + "");
realm.commitTransaction();
realm.close()
}
请参阅我的函数代码,您应该使用它。首先,您不应该使用 mRealm 字段,并且每次需要进行任何数据库操作时都不应调用 Realm.getDefaultInstance()
。
使用后别忘了调用realm.close()
关于java - Realm 未写入,因为已执行写入操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48021911/