2016-01-22 71 views
1

我在Android应用程序中使用Realm。 当我执行一个异步事务来保存我的对象时,我发现有时回调从来没有被调用过。线程是Android的主线程,并且没有任何异常被捕获。 有什么问题? 有我的代码:当我执行与Realm的异步事务时,从不会调用回调

try (Realm realm = Realm.getDefaultInstance()) { 
     Log.i("ysd", "thread:"+Thread.currentThread()); 
     realm.executeTransaction(new Realm.Transaction() { 
      @Override 
      public void execute(Realm bgRealm) { 
       Log.i("ysd", "copyToRealmOrUpdate"); 
       bgRealm.copyToRealmOrUpdate(t); 
      } 
     }, new Realm.Transaction.Callback() { 
      @Override 
      public void onSuccess() { 
       Log.i("ysd", "Realm——onSuccess"); 
       if(listener != null){ 
        listener.onOk(); 
       } 
      } 

      @Override 
      public void onError(Exception e) { 
       Log.i("ysd", "Realm:" + e.getMessage() + "," +  e.getCause()); 
       // transaction is automatically rolled-back, do any cleanup here 
       if(listener != null){ 
        listener.onError(e); 
       } 
      } 
     }); 
    }catch (Exception e){ 
     Log.i("ysd", "Realm_Exception:" + e.getMessage() + "," + e.getCause()); 
     e.printStackTrace(); 
    } 
+0

可能是监听器的原因为空,最好是用监听器初始化发布代码。 – Rahul

+0

“trym”实例在try catch块后关闭。当前的逻辑是,如果Realm实例关闭,'onSuccess'不会被发布到调用循环者。但我认为你的用户案例是有道理的。请参阅https://github.com/realm/realm-java/issues/1893,我们正在讨论是否应该一直公布'onSuccess'?在我们改变行为之前(也许),你可以用'Activity'或'Fragment'或其他东西来控制生命周期,以确保'onSuccess'将被发布。 – beeender

回答

0

我们有一个关于这个用户的案例讨论,我们认为这是更好地保持当前的行为。

为了确保onSuccess将被称为交易完成之后,您需要:

  1. 这将启动本次交易的领域实例没有关闭。 这是你的问题的原因。 try-catch块将在完成时关闭Realm实例。

  2. RealmAsyncTask未被取消。

  3. 调用者的循环线程仍在运行。