2016-11-05 11 views
2

せずに、スレッドから開かれますルーパーなしのスレッドからオープンされ、コールバックを提供しました。コールバックを呼び出すためにハンドラが必要です。 "あなたのレルムは、私は私はこのような非同期データの挿入を実行するための推奨レルムアプローチを以下思ったルーパー

私はこのコードを非アクティビティクラスで実行しています。それ。ありがとう。

更新 - 固定 質問に間違いがないことが判明しました。問題は私がIntentServiceから呼び出していたことです。私はアプリ最初の実行上のデータベースをシードしようとしていたので、私はこのように、この固定:UIスレッドから呼び出された場合

protected void onHandleIntent(Intent intent) { 
     Realm realm = Realm.getDefaultInstance(); 

     //Add sample Customers to database 
     List<Customer> customers = SampleCustomerData.getCustomers(); 

     realm.beginTransaction(); 
     for (Customer customer: customers){ 
      customer.setId(customerPrimaryKey.getAndIncrement()); 
      realm.copyToRealm(customer); 
     } 
     realm.commitTransaction(); 

realm.close(); 

    } 

IntentServiceの外に、固定のことを、クエリが正常に動作します。

+1

これはPresenterクラスから呼び出されます。私はスレッドを開始しなかった、私は非同期クエリを実行する独自のスレッドのレルムスピンをthougth thougth。 –

答えて

0

UIスレッドからaddCustomerに電話する必要があります。

+0

実際、IntentServiceのonHandleIntentから呼び出されているので、それが問題かどうか確認してください。 –

1

レルムは、HanflerとLooperクラスによるAndroidのスレッド通信に依存しています。 別のバックグラウンドスレッドから非同期操作をクエリするように見えます(理由は?、既にバックグラウンドにあり、同期バージョンを使用しています)。 Active Looperでスレッドが必要であることを修正します。ハンドラスレッドをバックグラウンドスレッドとして使用する - ルーパーを初期化する

+0

私は、プレゼンターから呼び出されたリポジトリからコードを実行しています。このクラスのContextオブジェクトにアクセスできますが、どうすれば問題を解決できますか? –

+0

http://stackoverflow.com/questions/25094330/example-communicating-with-handlerthread –

0

onSuccessonError方法の中に追加するには、このライン

insertRealm.close(); 

を試してみてください。現在のように最後の行から削除します。

だからあなたのコードは、バックグラウンドスレッドで呼び出される

insertRealm.executeTransactionAsync(new Realm.Transaction() { 
     @Override 
     public void execute(Realm backgroundRealm) { 
      //... 
     } 
    }, new Realm.Transaction.OnSuccess() { 
     @Override 
     public void onSuccess() { 
      // !!! 
     } 
    }, new Realm.Transaction.OnError() { 
     @Override 
     public void onError(Throwable error) { 
      // !!! 
     } 
    }); 

非同期トランザクションのコールバックのために

public void addCustomer(final Customer customer) { 
     final Realm insertRealm = Realm.getDefaultInstance(); 
     insertRealm.executeTransactionAsync(new Realm.Transaction() { 
      @Override 
      public void execute(Realm backgroundRealm) { 
       long id = customerPrimaryKey.incrementAndGet(); 
       customer.setId(id); 
       backgroundRealm.copyToRealm(customer); 
      } 
     }, new Realm.Transaction.OnSuccess() { 
      @Override 
      public void onSuccess() { 
       Log.d(LOG_TAG, "Customer Added"); 
       insertRealm.close(); 
      } 
     }, new Realm.Transaction.OnError() { 
      @Override 
      public void onError(Throwable error) { 
       Log.d(LOG_TAG, error.getMessage()); 
       insertRealm.close(); 
      } 
     }); 
    } 
1

のようになります、スレッドはルーパーに関連付けする必要があります(したがって、そのルーパーとスレッドと通信できるハンドラを持つ)。


ソリューションでは、バックグラウンドスレッドで同期トランザクションを使用します。

しかし、あなたはすでにそれを理解しました。

protected void onHandleIntent(Intent intent) { 
    Realm realm = null; 
    try { 
     realm = Realm.getDefaultInstance(); 
     final List<Customer> customers = SampleCustomerData.getCustomers(); 
     realm.executeTransaction(new Realm.Transaction() { 
      @Override 
      public void execute(Realm realm) { 
       for (Customer customer: customers){ 
        customer.setId(customerPrimaryKey.getAndIncrement()); 
        realm.insert(customer); 
       } 
      } 
     }); 
    } finally { 
     if(realm != null) { 
      realm.close(); 
     } 
    } 
} 
関連する問題