2016-02-29 2 views
3

Je reçois l'erreur suivante à ce code: "Votre domaine est ouvert à partir d'un thread sans Looper Les requêtes asynchrones ont besoin d'un gestionnaire pour envoyer les résultats de votre requête" à cette ligne:Erreur Android avec le royaume, en essayant d'utiliser asynchrone. Il est ouvert à partir d'un thread sans looper

"RealmResults<UserVehicle> completed = realm.where(UserVehicle.class).equalTo("id", userVehicleID).findAllAsync();" 

J'ai essayé de définir le realm.executeTransaction dans un Handler (Looper.getMain()) mais sans succès. Qu'est-ce que je fais mal?

PSVehicleService.getInstance(PSVehicleDetailsActivity.this).fetchVehicleTrips(userVehicle, fiveWeeksBeforeDate, lastTripDate, userID, new JsonCallback() { 
      @Override 
      public void onResponse(final JSONObject jsonObject, VolleyError error) { 
       if(jsonObject != null) { 
        Log.i("","testVehicles maybeFetchData 11"); 
        realm.executeTransaction(new Realm.Transaction() { 
         @Override 
         public void execute(Realm realm) { 
          try { 
           ObjectMapper mapper = new ObjectMapper(); 
           final List<Trip> trips = mapper.readValue(jsonObject.getJSONArray("trips").toString(), new TypeReference<List<Trip>>() { 
           }); 
           Log.i("","testVehicles maybeFetchData 12"); 
           RealmResults<UserVehicle> completed = realm.where(UserVehicle.class).equalTo("id", userVehicleID).findAllAsync(); 
           UserVehicle userVehicle = null; 
           if(completed.size() > 0){ 
            userVehicle = completed.get(0); 
           } 
           if(userVehicle != null) { 
            Log.i("", "testVehicles maybeFetchData 13"); 
            userVehicle.getTrips().clear(); 
            Log.i("", "testVehicles maybeFetchData 14"); 
            userVehicle.getTrips().addAll(trips); 
            Log.i("", "testVehicles maybeFetchData 15"); 
            realm.copyToRealmOrUpdate(userVehicle); 
            Log.i("", "testVehicles maybeFetchData 16"); 
           }else{ 
            Log.i("", "testVehicles maybeFetchData 16 NULLLLLLLL"); 
           } 
          } catch (Exception e) { 
           Log.i("", "fetchTripsSinceWeeksInPast fetchVehicleTrips2 error" + e.getMessage()); 
           Utils.appendLog("ERROR fetchVehicleTrips is:" + e.getMessage(), true); 
          } 
         } 
        }, new Realm.Transaction.Callback() { 
         @Override 
         public void onSuccess() { 
          Log.i("","testVehicles maybeFetchData 17"); 
          setPager(); 
          Log.i("","testVehicles maybeFetchData 18"); 
         } 

         @Override 
         public void onError(Exception e) { 
          Log.i("","testVehicles maybeFetchData 18 ERROR:" + e.getMessage()); 
         } 
        }); 
       } 
      } 
     }); 
+0

Pouvez-vous s'il vous plaît partager le code où avez-vous appelé 'findAllAsync'? – beeender

+0

findAllAsync est là, à l'intérieur d'exécuter, la 5ème ligne. Après "Log.i (" "," testVehicles maybeFetchData 12 ");" –

Répondre

3

Le problème est que vous utilisez des requêtes asynchrones dans une transaction asynchrone - ce qui n'est pas du tout nécessaire. Lors de l'appel realm.executeTransaction(Realm.Transaction, Realm.Transaction.Callback), le bloc de code de la transaction s'exécutera dans un thread de travail qui n'a pas de boucleur et n'a pas besoin d'un boucleur.

Mais pour les requêtes asynchrones, vous avez besoin d'un looper pour vous assurer que le résultat de la requête peut être renvoyé sur Android. Donc, pour résoudre votre problème, utilisez simplement la requête de synchronisation, laissez-la simplement tourner dans le thread de travail de la transaction. as:

RealmResults<UserVehicle> completed = realm.where(UserVehicle.class).equalTo("id", userVehicleID).findAll(); 
+0

merci !!! : D c'était le problème –