2017-12-29 11 views
0

Ich versuche, meine Recycler Ansicht, dass, wenn die Plus-Taste auf einer seiner Elemente zu aktualisieren, eine Menge Textansicht auf das Element geklickt wird um 1 erhöhtRealm Schreiben nicht, weil bereits die Durchführung Schreiboperation

Hier ist der Code für den Klick-Listener im Adapter.

holder.mQuantityPlusTextView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       mEventBus.post(new CartQuantityPlusClickEvent(imgUrl)); 
       notifyDataSetChanged(); 
      } 
     }); 

Hier ist der Code für die Aktivität, die den EventBus abonniert.

@Subscribe(threadMode = ThreadMode.POSTING) 
public void cartQuantityPlusClick(CartQuantityPlusClickEvent event) { 
    mClothingRepository.plusClothingCartQuantity(event.getImgUrl()); 
} 

Hier ist der Code für die tatsächliche Mengenaktualisierung.

@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(); 
} 

Wenn ich die App ausführen und die Taste drücken. Es tritt keine Mengenänderung auf, obwohl genau derselbe Code verwendet wird wie die Menge, die funktioniert.

Hier ist der Code für die Verringerung der Menge (der Code für den Adapter und Event-Bus ist praktisch gleich).

@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(); 
} 

Die Anweisungslog im Code für die Menge erhöht wird, so dass die item Variablen und dass null sind:

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) 

ich meine Reich-Instanz aus dem Konstruktor der Repository-Klasse, in der all Business-Logik erhalten ist beinhaltet.

public ClothingRepository() { 
    mEventBus = EventBus.getDefault(); 
    mRealm = Realm.getDefaultInstance(); 
    mClothingRef = FirebaseDatabase.getInstance().getReference() 
      .child(FIREBASE_CLOTHING_REFERENCE); 
} 

Ich schließe es nicht, weil ich nicht sicher bin, wie. Ich denke, das könnte Teil des Problems sein. Wie behebe ich das?

+0

anrufen * Ich bin nicht sicher, wie man * - rufen 'mRealm.close()' –

+0

Ja, aber wenn ich nenne 'mRealm.close()' kann ich es immer noch verwenden später? –

+0

nein. Lesen Sie die Dokumentation –

Antwort

0

Sie sollten immer Instanz von Realm vor der Verwendung erhalten. Und schließen Sie die Instanz nach der Verwendung.

@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() 
} 

Siehe meinen Code, den Sie verwenden sollten. Zuerst sollten Sie das mRealm-Feld nicht verwenden und immer dann Realm.getDefaultInstance() aufrufen, wenn Sie einen DB-Vorgang wünschen. Nach der Verwendung nicht vergessen realm.close()

Verwandte Themen