2016-08-29 2 views
1

Frage klingt ähnlich wie zuvor gestellte Fragen. Ich habe diese genannt, aber ich konnte keine Lösung für dieses Problem finden.Realmio - Realm-Objekte können nur aus dem Thread zugegriffen werden sie erstellt wurden

private AddCartItemDialog.CartItemListener cartItemListener = new AddCartItemDialog.CartItemListener() { 
     @Override 
     public void onOkClick(Product cartItem, int quantity) { 

      realm.executeTransactionAsync(new Realm.Transaction() { 
       @Override 
       public void execute(Realm bgRealm) { 

        DraftInvoice draftInvoice = bgRealm.where(DraftInvoice.class).equalTo("shop.id", shopId).findFirst(); 


        InvoiceItem invoiceItem = bgRealm.createObject(InvoiceItem.class); 
        invoiceItem.setPrice(cartItem.getPrice()); 
        invoiceItem.setId(cartItem.getId()); 
        invoiceItem.setQuantity(quantity); 
        invoiceItem.calculateTotal(); 

        draftInvoice.getInvoiceItems().add(invoiceItem); 

        updateCartItemCount(draftInvoice.getInvoiceItems().size()); 
       } 
      },() -> { 

      }, error -> { 
       error.printStackTrace(); 
       Logger.e(error.getMessage()); 
      }); 

     } 

     @Override 
     public void onCancelClick() { 

     } 
    }; 

Fehlerprotokoll zeigt folgende Fehler -

08-28 15:10:25.214 4996-4996/com.example.realshoptest W/System.err: java.lang.IllegalStateException: Realm access from incorrect thread. Realm objects can only be accessed on the thread they were created. 
08-28 15:10:25.214 4996-4996/com.example.realshoptest W/System.err:  at io.realm.BaseRealm.checkIfValid(BaseRealm.java:449) 
08-28 15:10:25.214 4996-4996/com.example.realshoptest W/System.err:  at io.realm.ProductRealmProxy.realmGet$price(ProductRealmProxy.java:159) 
08-28 15:10:25.214 4996-4996/com.example.realshoptest W/System.err:  at com.example.realshoptest.models.Product.getPrice(Product.java:75) 
08-28 15:10:25.214 4996-4996/com.example.realshoptest W/System.err:  at com.example.realshoptest.NewInvoiceActivity$1$1.execute(NewInvoiceActivity.java:76) 
08-28 15:10:25.214 4996-4996/com.example.realshoptest W/System.err:  at io.realm.Realm$1.run(Realm.java:1187) 
08-28 15:10:25.214 4996-4996/com.example.realshoptest W/System.err:  at io.realm.internal.async.BgPriorityRunnable.run(BgPriorityRunnable.java:34) 
08-28 15:10:25.214 4996-4996/com.example.realshoptest W/System.err:  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422) 
08-28 15:10:25.214 4996-4996/com.example.realshoptest W/System.err:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
08-28 15:10:25.214 4996-4996/com.example.realshoptest W/System.err:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
08-28 15:10:25.214 4996-4996/com.example.realshoptest W/System.err:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
08-28 15:10:25.214 4996-4996/com.example.realshoptest W/System.err:  at java.lang.Thread.run(Thread.java:818) 
08-28 15:10:25.214 4996-4996/com.example.realshoptest E/TestShopApp: Realm access from incorrect thread. Realm objects can only be accessed on the thread they were created. 

Fehler treten bei dieser Linie - invoiceItem.setPrice(cartItem.getPrice());

Dieses Stück Code scheint aus meinem Verständnis zu arbeiten, aber es funktioniert nicht, wie ich den Zugriff auf Objekte asynchron in demselben Thread. Was fehlt mir hier?

+0

Sie greifen auf cartItem zu –

+0

@TimCastelijns Ja danke für den Hinweis. Wie kann ich 'cartItem' an den Dialog übergeben, seine Menge aktualisieren und sie im Listener zurückbekommen? – Gimali

+0

Übergeben Sie stattdessen die ID und fragen Sie nach dem Objekt innerhalb des Ausführungsblocks –

Antwort

1
public void onOkClick(Product cartItem, int quantity) { 

Diese Linie erhält einen Product aus dem Reich der UI-Thread-Instanz

 realm.executeTransactionAsync(new Realm.Transaction() { 
      @Override 
      public void execute(Realm bgRealm) { 

Dieser Aufruf eine Realm-Instanz für den Hintergrund-Thread erstellt

   invoiceItem.setPrice(cartItem.getPrice()); 

cartItem in das Reich gehört noch der UI-Thread Beispiel, daher kann auf den Hintergrundthread

nicht zugegriffen werden

zwei Lösungen an:

1.) nur auf den Hintergrund-Thread die Parameter senden

public void onOkClick(Product cartItem, int quantity) { 
     final long cartItemId = cartItem.getId(); 
     final String price = cartItem.getPrice(); 
     realm.executeTransactionAsync(new Realm.Transaction() { 
      @Override 
      public void execute(Realm bgRealm) { 
       DraftInvoice draftInvoice = bgRealm.where(DraftInvoice.class).equalTo("shop.id", shopId).findFirst(); 
       InvoiceItem invoiceItem = bgRealm.createObject(InvoiceItem.class); 
       invoiceItem.setPrice(price); 
       invoiceItem.setId(cartItemId); 

oder

2.) requery das Objekt mit dem Realm-Instanz Hintergrund-Thread

public void onOkClick(Product cartItem, int quantity) { 
     final long cartItemId = cartItem.getId(); 
     realm.executeTransactionAsync(new Realm.Transaction() { 
      @Override 
      public void execute(Realm bgRealm) { 
       Product product = bgRealm.where(Product.class).equalTo("id", cartItemId).findFirst(); 
       DraftInvoice draftInvoice = bgRealm.where(DraftInvoice.class).equalTo("shop.id", shopId).findFirst(); 
       InvoiceItem invoiceItem = bgRealm.createObject(InvoiceItem.class); 
       invoiceItem.setPrice(product.getPrice()); 
       invoiceItem.setId(cartItemId); 

Die zweite Lösung ist sauberer.

Verwandte Themen