From fff6c29f835c878398dc7b636b17dd28a1816eff Mon Sep 17 00:00:00 2001 From: Chen Mulong Date: Tue, 5 Jul 2016 21:01:22 +0800 Subject: [PATCH] More GCed ref for flaky test --- .../java/io/realm/DynamicRealmTests.java | 3 +- .../java/io/realm/NotificationsTest.java | 6 ++++ .../java/io/realm/RealmAsyncQueryTests.java | 32 ++++++++++++++++++- .../io/realm/RealmChangeListenerTests.java | 6 ++++ .../java/io/realm/RealmModelTests.java | 1 + .../java/io/realm/RealmObjectTests.java | 2 ++ .../java/io/realm/RealmQueryTests.java | 4 +++ .../java/io/realm/RealmResultsTests.java | 12 ++++++- .../androidTest/java/io/realm/RealmTests.java | 6 ++-- .../androidTest/java/io/realm/SortTest.java | 7 +++- .../io/realm/TypeBasedNotificationsTests.java | 26 +++++++++++++++ 11 files changed, 98 insertions(+), 7 deletions(-) diff --git a/realm/realm-library/src/androidTest/java/io/realm/DynamicRealmTests.java b/realm/realm-library/src/androidTest/java/io/realm/DynamicRealmTests.java index 69c76784d5..5efec33d5c 100644 --- a/realm/realm-library/src/androidTest/java/io/realm/DynamicRealmTests.java +++ b/realm/realm-library/src/androidTest/java/io/realm/DynamicRealmTests.java @@ -397,11 +397,12 @@ public void onChange(RealmResults object) { }); } - // Initialize a Dynamic Realm used by the *Async tests. + // Initialize a Dynamic Realm used by the *Async tests and keep it ref in the looperThread. private DynamicRealm initializeDynamicRealm() { RealmConfiguration defaultConfig = looperThread.realmConfiguration; final DynamicRealm dynamicRealm = DynamicRealm.getInstance(defaultConfig); populateTestRealm(dynamicRealm, 10); + looperThread.keepStrongReference.add(dynamicRealm); return dynamicRealm; } diff --git a/realm/realm-library/src/androidTest/java/io/realm/NotificationsTest.java b/realm/realm-library/src/androidTest/java/io/realm/NotificationsTest.java index 80a7ed45c2..b03478a1e0 100644 --- a/realm/realm-library/src/androidTest/java/io/realm/NotificationsTest.java +++ b/realm/realm-library/src/androidTest/java/io/realm/NotificationsTest.java @@ -1020,6 +1020,7 @@ public void realmResultsListenerAddedAfterCommit() { realm.createObject(AllTypes.class); realm.commitTransaction(); + looperThread.keepStrongReference.add(results); results.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults object) { @@ -1227,6 +1228,7 @@ public void realmListener_localChangeShouldBeSendAtFrontOfTheQueueWithLoadedAsyn assertEquals(1, results.size()); + looperThread.keepStrongReference.add(asyncResults); asyncResults.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults element) { @@ -1325,6 +1327,7 @@ public void w(String message) { realm.commitTransaction(); RealmResults results = realm.where(AllTypes.class).findAllAsync(); + looperThread.keepStrongReference.add(results); results.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults element) { @@ -1344,6 +1347,7 @@ public void accessingSyncRealmResultInsideAsyncResultListener() { final RealmResults syncResults = realm.where(AllTypes.class).findAll(); RealmResults results = realm.where(AllTypes.class).findAllAsync(); + looperThread.keepStrongReference.add(results); results.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults results) { @@ -1380,6 +1384,8 @@ public void accessingSyncRealmResultsInsideAnotherResultListener() { final Realm realm = looperThread.realm; final RealmResults syncResults1 = realm.where(AllTypes.class).findAll(); final RealmResults syncResults2 = realm.where(AllTypes.class).findAll(); + + looperThread.keepStrongReference.add(syncResults1); syncResults1.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults element) { diff --git a/realm/realm-library/src/androidTest/java/io/realm/RealmAsyncQueryTests.java b/realm/realm-library/src/androidTest/java/io/realm/RealmAsyncQueryTests.java index 7ccb8ba80a..f4707f7486 100644 --- a/realm/realm-library/src/androidTest/java/io/realm/RealmAsyncQueryTests.java +++ b/realm/realm-library/src/androidTest/java/io/realm/RealmAsyncQueryTests.java @@ -328,6 +328,7 @@ public void findAllAsync() throws Throwable { assertFalse(results.isLoaded()); assertEquals(0, results.size()); + looperThread.keepStrongReference.add(results); results.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults object) { @@ -437,6 +438,7 @@ public void findAllAsync_forceLoad() throws Throwable { .between("columnLong", 0, 4) .findAllAsync(); + looperThread.keepStrongReference.add(realmResults); // notification should be called as well realmResults.addChangeListener(new RealmChangeListener>() { @Override @@ -512,6 +514,7 @@ public boolean onInterceptInMessage(int what) { assertEquals(0, realmResults.size()); // 6. Callback triggered after retry has completed + looperThread.keepStrongReference.add(realmResults); realmResults.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults object) { @@ -594,6 +597,9 @@ public void run() { } }; + looperThread.keepStrongReference.add(realmResults1); + looperThread.keepStrongReference.add(realmResults2); + realmResults1.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults object) { @@ -675,6 +681,8 @@ public boolean onInterceptInMessage(int what) { assertFalse(realmResults.isLoaded()); assertEquals(0, realmResults.size()); + looperThread.keepStrongReference.add(realmResults); + // Add change listener that should only be called once realmResults.addChangeListener(new RealmChangeListener>() { @Override @@ -772,6 +780,9 @@ public void run() { } }; + looperThread.keepStrongReference.add(realmResults1); + looperThread.keepStrongReference.add(realmResults2); + realmResults1.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults object) { @@ -809,7 +820,7 @@ public void findFirstAsync() { final AllTypes asyncObj = realm.where(AllTypes.class).findFirstAsync(); assertFalse(asyncObj.isValid()); assertFalse(asyncObj.isLoaded()); - + looperThread.keepStrongReference.add(asyncObj); asyncObj.addChangeListener(new RealmChangeListener() { @Override public void onChange(AllTypes object) { @@ -825,6 +836,7 @@ public void onChange(AllTypes object) { public void findFirstAsync_initalEmptyRow() throws Throwable { Realm realm = looperThread.realm; final AllTypes firstAsync = realm.where(AllTypes.class).findFirstAsync(); + looperThread.keepStrongReference.add(firstAsync); firstAsync.addChangeListener(new RealmChangeListener() { @Override public void onChange(AllTypes object) { @@ -859,6 +871,7 @@ public void findFirstAsync_updatedIfsyncRealmObjectIsUpdated() throws Throwable assertEquals(0, firstAsync.getColumnLong()); assertEquals("test data 0", firstAsync.getColumnString()); + looperThread.keepStrongReference.add(firstAsync); firstAsync.addChangeListener(new RealmChangeListener() { @Override public void onChange(AllTypes object) { @@ -883,6 +896,7 @@ public void findFirstAsync_withNotification() throws Throwable { .between("columnLong", 4, 9) .findFirstAsync(); + looperThread.keepStrongReference.add(realmResults); realmResults.addChangeListener(new RealmChangeListener() { @Override public void onChange(AllTypes object) { @@ -976,6 +990,7 @@ public boolean onInterceptInMessage(int what) { } // Add change listener that should only be called once after the retry completed. + looperThread.keepStrongReference.add(realmResults); realmResults.addChangeListener(new RealmChangeListener() { @Override public void onChange(AllTypes object) { @@ -1006,6 +1021,7 @@ public void findAllSortedAsync() throws Throwable { assertFalse(results.isLoaded()); assertEquals(0, results.size()); + looperThread.keepStrongReference.add(results); results.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults object) { @@ -1068,6 +1084,7 @@ public boolean onInterceptInMessage(int what) { // 4. Intercepting the query completed event the first time will // cause a commit that should cause the findAllSortedAsync to be re-run. // This change listener should only be called with the final result. + looperThread.keepStrongReference.add(realmResults); realmResults.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults object) { @@ -1161,6 +1178,9 @@ public void run() { } }; + looperThread.keepStrongReference.add(realmResults1); + looperThread.keepStrongReference.add(realmResults2); + realmResults1.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults object) { @@ -1302,6 +1322,9 @@ public void run() { } }; + looperThread.keepStrongReference.add(realmResults1); + looperThread.keepStrongReference.add(realmResults2); + realmResults1.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults object) { @@ -1558,6 +1581,10 @@ public void run() { } }; + looperThread.keepStrongReference.add(distinctBool); + looperThread.keepStrongReference.add(distinctLong); + looperThread.keepStrongReference.add(distinctDate); + looperThread.keepStrongReference.add(distinctString); distinctBool.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults object) { @@ -1767,6 +1794,7 @@ public void queryingLinkHandover() throws Throwable { final Realm realm = looperThread.realm; final RealmResults allAsync = realm.where(Dog.class).equalTo("owner.name", "kiba").findAllAsync(); + looperThread.keepStrongReference.add(allAsync); allAsync.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults object) { @@ -1826,6 +1854,7 @@ public void testFindFirstUsesCallerThreadVersion() throws Throwable { Realm.asyncTaskExecutor.pause(); final AllTypes firstAsync = looperThread.realm.where(AllTypes.class).findFirstAsync(); + looperThread.keepStrongReference.add(firstAsync); firstAsync.addChangeListener(new RealmChangeListener() { @Override public void onChange(AllTypes object) { @@ -1959,6 +1988,7 @@ public void badVersion_syncTransaction() throws NoSuchFieldException, IllegalAcc // 1. Make sure that async query is not started final RealmResults result = realm.where(AllTypes.class).findAllSortedAsync(AllTypes.FIELD_STRING); + looperThread.keepStrongReference.add(result); result.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults object) { diff --git a/realm/realm-library/src/androidTest/java/io/realm/RealmChangeListenerTests.java b/realm/realm-library/src/androidTest/java/io/realm/RealmChangeListenerTests.java index 4778fbe2e9..23f08c5aec 100644 --- a/realm/realm-library/src/androidTest/java/io/realm/RealmChangeListenerTests.java +++ b/realm/realm-library/src/androidTest/java/io/realm/RealmChangeListenerTests.java @@ -98,6 +98,7 @@ public void onChange(DynamicRealm dynRealm) { public void returnedRealmResultsIsNotNull() { Realm realm = looperThread.realm; RealmResults cats = realm.where(Cat.class).findAll(); + looperThread.keepStrongReference.add(cats); cats.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults result) { @@ -116,6 +117,7 @@ public void onChange(RealmResults result) { public void returnedRealmResultsOfModelIsNotNull() { Realm realm = looperThread.realm; RealmResults alltypes = realm.where(AllTypesRealmModel.class).findAll(); + looperThread.keepStrongReference.add(alltypes); alltypes.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults result) { @@ -139,6 +141,7 @@ public void returnedRealmObjectIsNotNull() { Cat cat = looperThread.realm.createObject(Cat.class); realm.commitTransaction(); + looperThread.keepStrongReference.add(cat); cat.addChangeListener(new RealmChangeListener() { @Override public void onChange(Cat object) { @@ -160,6 +163,7 @@ public void returnedRealmModelIsNotNull() { AllTypesRealmModel model = realm.createObject(AllTypesRealmModel.class); realm.commitTransaction(); + looperThread.keepStrongReference.add(model); RealmObject.addChangeListener(model, new RealmChangeListener() { @Override public void onChange(AllTypesRealmModel object) { @@ -184,6 +188,7 @@ public void returnedDynamicRealmObjectIsNotNull() { DynamicRealmObject allTypes = dynamicRealm.createObject(AllTypes.CLASS_NAME); dynamicRealm.commitTransaction(); + looperThread.keepStrongReference.add(allTypes); allTypes.addChangeListener(new RealmChangeListener() { @Override public void onChange(DynamicRealmObject object) { @@ -205,6 +210,7 @@ public void returnedDynamicRealmResultsIsNotNull() { final DynamicRealm dynamicRealm = DynamicRealm.getInstance(looperThread.realmConfiguration); RealmResults all = dynamicRealm.where(AllTypes.CLASS_NAME).findAll(); + looperThread.keepStrongReference.add(all); all.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults result) { diff --git a/realm/realm-library/src/androidTest/java/io/realm/RealmModelTests.java b/realm/realm-library/src/androidTest/java/io/realm/RealmModelTests.java index 5bf386836c..d634c2a2da 100644 --- a/realm/realm-library/src/androidTest/java/io/realm/RealmModelTests.java +++ b/realm/realm-library/src/androidTest/java/io/realm/RealmModelTests.java @@ -192,6 +192,7 @@ public void async_query() { populateTestRealm(realm, TEST_DATA_SIZE); final RealmResults allTypesRealmModels = realm.where(AllTypesRealmModel.class).distinctAsync(AllTypesRealmModel.FIELD_STRING); + looperThread.keepStrongReference.add(allTypesRealmModels); allTypesRealmModels.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults object) { diff --git a/realm/realm-library/src/androidTest/java/io/realm/RealmObjectTests.java b/realm/realm-library/src/androidTest/java/io/realm/RealmObjectTests.java index 644d3caa34..7c64ba48cd 100644 --- a/realm/realm-library/src/androidTest/java/io/realm/RealmObjectTests.java +++ b/realm/realm-library/src/androidTest/java/io/realm/RealmObjectTests.java @@ -1716,6 +1716,7 @@ public void addChangeListener_returnedObjectOfCopyToRealmOrUpdate() { allTypesPrimaryKey = realm.copyToRealmOrUpdate(allTypesPrimaryKey); realm.commitTransaction(); + looperThread.keepStrongReference.add(allTypesPrimaryKey); allTypesPrimaryKey.addChangeListener(new RealmChangeListener() { @Override public void onChange(AllTypesPrimaryKey element) { @@ -1793,6 +1794,7 @@ public void addChangeListener_checkHandlerRealmObjectsWhenCallingOnAsyncObject() realm.handlerController.realmObjects; final AllTypesPrimaryKey allTypesPrimaryKey = realm.where(AllTypesPrimaryKey.class).findFirstAsync(); + looperThread.keepStrongReference.add(allTypesPrimaryKey); allTypesPrimaryKey.addChangeListener(new RealmChangeListener() { @Override public void onChange(AllTypesPrimaryKey element) { diff --git a/realm/realm-library/src/androidTest/java/io/realm/RealmQueryTests.java b/realm/realm-library/src/androidTest/java/io/realm/RealmQueryTests.java index 9c50d7123c..5dcce6ca09 100644 --- a/realm/realm-library/src/androidTest/java/io/realm/RealmQueryTests.java +++ b/realm/realm-library/src/androidTest/java/io/realm/RealmQueryTests.java @@ -2311,6 +2311,10 @@ public void run() { } }; + looperThread.keepStrongReference.add(distinctBool); + looperThread.keepStrongReference.add(distinctLong); + looperThread.keepStrongReference.add(distinctDate); + looperThread.keepStrongReference.add(distinctString); distinctBool.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults object) { diff --git a/realm/realm-library/src/androidTest/java/io/realm/RealmResultsTests.java b/realm/realm-library/src/androidTest/java/io/realm/RealmResultsTests.java index ebc5546a4f..cf2ea4fd8b 100644 --- a/realm/realm-library/src/androidTest/java/io/realm/RealmResultsTests.java +++ b/realm/realm-library/src/androidTest/java/io/realm/RealmResultsTests.java @@ -342,7 +342,7 @@ public void distinct_invalidTypesLinkedFields() { @Test @RunTestInLooperThread public void changeListener_syncIfNeeded_updatedFromOtherThread() { - final Realm realm = Realm.getInstance(looperThread.createConfiguration("Foo")); + final Realm realm = looperThread.realm; populateTestRealm(realm, 10); final RealmResults results = realm.where(AllTypes.class).lessThan(AllTypes.FIELD_LONG, 10).findAll(); @@ -450,6 +450,10 @@ public void run() { } }; + looperThread.keepStrongReference.add(distinctBool); + looperThread.keepStrongReference.add(distinctLong); + looperThread.keepStrongReference.add(distinctDate); + looperThread.keepStrongReference.add(distinctString); distinctBool.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults object) { @@ -512,6 +516,8 @@ public void run() { } }; + looperThread.keepStrongReference.add(distinctDate); + looperThread.keepStrongReference.add(distinctString); distinctDate.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults object) { @@ -856,6 +862,7 @@ public void addChangeListener() { Realm realm = looperThread.realm; RealmResults collection = realm.where(AllTypes.class).findAll(); + looperThread.keepStrongReference.add(collection); collection.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults object) { @@ -900,6 +907,7 @@ public void run() { }); // Adding it twice will be ignored, so removing it will not cause the listener to be triggered. + looperThread.keepStrongReference.add(collection); collection.addChangeListener(listener); collection.addChangeListener(listener); collection.removeChangeListener(listener); @@ -933,6 +941,7 @@ public void onChange(RealmResults object) { } }; + looperThread.keepStrongReference.add(collection); collection.addChangeListener(listener); collection.removeChangeListener(listener); @@ -983,6 +992,7 @@ public void onChange(RealmResults object) { } }; + looperThread.keepStrongReference.add(collection); collection.addChangeListener(listenerA); collection.addChangeListener(listenerB); collection.removeChangeListeners(); diff --git a/realm/realm-library/src/androidTest/java/io/realm/RealmTests.java b/realm/realm-library/src/androidTest/java/io/realm/RealmTests.java index 063c5139d1..5bd703a724 100644 --- a/realm/realm-library/src/androidTest/java/io/realm/RealmTests.java +++ b/realm/realm-library/src/androidTest/java/io/realm/RealmTests.java @@ -2799,7 +2799,7 @@ public void execute(Realm realm) { @Test @RunTestInLooperThread public void closeRealmInChangeListenerWhenThereIsListenerOnEmptyObject() { - final Realm realm = Realm.getInstance(looperThread.createConfiguration()); + final Realm realm = looperThread.realm; final RealmChangeListener dummyListener = new RealmChangeListener() { @Override public void onChange(AllTypes object) { @@ -2840,7 +2840,7 @@ public void execute(Realm realm) { @Test @RunTestInLooperThread public void closeRealmInChangeListenerWhenThereIsListenerOnObject() { - final Realm realm = Realm.getInstance(looperThread.createConfiguration()); + final Realm realm = looperThread.realm; final RealmChangeListener dummyListener = new RealmChangeListener() { @Override public void onChange(AllTypes object) { @@ -2885,7 +2885,7 @@ public void execute(Realm realm) { @Test @RunTestInLooperThread public void closeRealmInChangeListenerWhenThereIsListenerOnResults() { - final Realm realm = Realm.getInstance(looperThread.createConfiguration()); + final Realm realm = looperThread.realm; final RealmChangeListener> dummyListener = new RealmChangeListener>() { @Override public void onChange(RealmResults object) { diff --git a/realm/realm-library/src/androidTest/java/io/realm/SortTest.java b/realm/realm-library/src/androidTest/java/io/realm/SortTest.java index 7c787c5f59..396e9cdf91 100644 --- a/realm/realm-library/src/androidTest/java/io/realm/SortTest.java +++ b/realm/realm-library/src/androidTest/java/io/realm/SortTest.java @@ -344,7 +344,7 @@ public void realmSortMultiFailures() { public void resorting() throws InterruptedException { final AtomicInteger changeListenerCalled = new AtomicInteger(4); - final Realm realm = Realm.getInstance(looperThread.createConfiguration()); + final Realm realm = looperThread.realm; realm.setAutoRefresh(true); final Runnable endTest = new Runnable() { @@ -365,6 +365,7 @@ public void run() { // rr0: [0, 1, 2, 3] final RealmResults rr0 = realm.where(AllTypes.class).findAll(); + looperThread.keepStrongReference.add(rr0); rr0.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults element) { @@ -376,6 +377,7 @@ public void onChange(RealmResults element) { // rr1: [1, 2, 0, 3] final RealmResults rr1 = realm.where(AllTypes.class).findAll().sort(FIELD_LONG, Sort.ASCENDING); + looperThread.keepStrongReference.add(rr1); rr1.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults element) { @@ -391,6 +393,7 @@ public void onChange(RealmResults element) { // rr2: [0, 3, 1, 2] final RealmResults rr2 = realm.where(AllTypes.class).findAll().sort(FIELD_LONG, Sort.DESCENDING); + looperThread.keepStrongReference.add(rr2); rr2.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults element) { @@ -479,6 +482,7 @@ public void run() { RealmResults objectsAscending = realm.where(AllTypes.class).findAllSorted(AllTypes.FIELD_DATE, Sort.ASCENDING); assertEquals(TEST_SIZE, objectsAscending.size()); + looperThread.keepStrongReference.add(objectsAscending); objectsAscending.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults element) { @@ -494,6 +498,7 @@ public void onChange(RealmResults element) { RealmResults objectsDescending = realm.where(AllTypes.class).findAllSorted(AllTypes.FIELD_DATE, Sort.DESCENDING); assertEquals(TEST_SIZE, objectsDescending.size()); + looperThread.keepStrongReference.add(objectsDescending); objectsDescending.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults element) { diff --git a/realm/realm-library/src/androidTest/java/io/realm/TypeBasedNotificationsTests.java b/realm/realm-library/src/androidTest/java/io/realm/TypeBasedNotificationsTests.java index ae3d2f8526..34cbeef9ef 100644 --- a/realm/realm-library/src/androidTest/java/io/realm/TypeBasedNotificationsTests.java +++ b/realm/realm-library/src/androidTest/java/io/realm/TypeBasedNotificationsTests.java @@ -104,6 +104,7 @@ public void run() { final Dog dog = realm.createObject(Dog.class); realm.commitTransaction(); + looperThread.keepStrongReference.add(dog); dog.addChangeListener(new RealmChangeListener() { @Override public void onChange(Dog object) { @@ -121,6 +122,7 @@ public void onChange(Dog object) { @RunTestInLooperThread public void callback_should_trigger_for_createObject_dynamic_realm() { final DynamicRealm realm = DynamicRealm.getInstance(looperThread.realmConfiguration); + looperThread.keepStrongReference.add(realm); realm.addChangeListener(new RealmChangeListener() { @Override public void onChange(DynamicRealm object) { @@ -141,6 +143,7 @@ public void run() { final DynamicRealmObject dog = realm.createObject("Dog"); realm.commitTransaction(); + looperThread.keepStrongReference.add(dog); dog.addChangeListener(new RealmChangeListener() { @Override public void onChange(DynamicRealmObject object) { @@ -180,6 +183,7 @@ public void run() { final Dog dog = realm.copyToRealm(akamaru); realm.commitTransaction(); + looperThread.keepStrongReference.add(dog); dog.addChangeListener(new RealmChangeListener() { @Override public void onChange(Dog object) { @@ -221,6 +225,7 @@ public void run() { final PrimaryKeyAsLong primaryKeyAsLong = realm.copyToRealmOrUpdate(obj); realm.commitTransaction(); + looperThread.keepStrongReference.add(primaryKeyAsLong); primaryKeyAsLong.addChangeListener(new RealmChangeListener() { @Override public void onChange(PrimaryKeyAsLong object) { @@ -268,6 +273,7 @@ public void run() { realm.commitTransaction(); in.close(); + looperThread.keepStrongReference.add(objectFromJson); objectFromJson.addChangeListener(new RealmChangeListener() { @Override public void onChange(AllTypes object) { @@ -323,6 +329,7 @@ public void run() { final AllTypes objectFromJson = realm.createObjectFromJson(AllTypes.class, json); realm.commitTransaction(); + looperThread.keepStrongReference.add(objectFromJson); objectFromJson.addChangeListener(new RealmChangeListener() { @Override public void onChange(AllTypes object) { @@ -386,6 +393,7 @@ public void run() { realm.commitTransaction(); in.close(); + looperThread.keepStrongReference.add(objectFromJson); objectFromJson.addChangeListener(new RealmChangeListener() { @Override public void onChange(AllTypesPrimaryKey object) { @@ -445,6 +453,7 @@ public void run() { final AllTypesPrimaryKey newObj = realm.createOrUpdateObjectFromJson(AllTypesPrimaryKey.class, json); realm.commitTransaction(); + looperThread.keepStrongReference.add(newObj); newObj.addChangeListener(new RealmChangeListener() { @Override public void onChange(AllTypesPrimaryKey object) { @@ -478,6 +487,7 @@ public void callback_with_relevant_commit_realmobject_sync() { realm.commitTransaction(); final Dog dog = realm.where(Dog.class).findFirst(); + looperThread.keepStrongReference.add(dog); dog.addChangeListener(new RealmChangeListener() { @Override public void onChange(Dog object) { @@ -536,6 +546,7 @@ public void callback_with_relevant_commit_realmobject_async() { final Dog dog = realm.where(Dog.class).findFirstAsync(); assertTrue(dog.load()); + looperThread.keepStrongReference.add(dog); dog.addChangeListener(new RealmChangeListener() { @Override public void onChange(Dog object) { @@ -613,6 +624,7 @@ public void onChange(Realm object) { final Dog dog = realm.where(Dog.class).findFirstAsync(); assertTrue(dog.load()); + looperThread.keepStrongReference.add(dog); dog.addChangeListener(new RealmChangeListener() { @Override public void onChange(Dog object) { @@ -713,6 +725,7 @@ public void onChange(Realm object) { final Dog dog = realm.where(Dog.class).findFirstAsync(); assertTrue(dog.load()); + looperThread.keepStrongReference.add(dog); dog.addChangeListener(new RealmChangeListener() { @Override public void onChange(Dog object) { @@ -797,6 +810,7 @@ public void callback_with_relevant_commit_realmresults_sync() { realm.commitTransaction(); final RealmResults dogs = realm.where(Dog.class).findAll(); + looperThread.keepStrongReference.add(dogs); dogs.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults object) { @@ -854,6 +868,7 @@ public void callback_with_relevant_commit_realmresults_async() { final RealmResults dogs = realm.where(Dog.class).findAllAsync(); assertTrue(dogs.load()); + looperThread.keepStrongReference.add(dogs); dogs.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults object) { @@ -930,6 +945,7 @@ public void run() { realm.commitTransaction(); Dog dog = realm.where(Dog.class).findFirst(); + looperThread.keepStrongReference.add(dog); for (int i = 0; i < NUMBER_OF_LISTENERS; i++) { dog.addChangeListener(new RealmChangeListener() { @Override @@ -971,6 +987,7 @@ public void run() { Dog dog = realm.where(Dog.class).findFirstAsync(); assertTrue(dog.load()); + looperThread.keepStrongReference.add(dog); for (int i = 0; i < NUMBER_OF_LISTENERS; i++) { dog.addChangeListener(new RealmChangeListener() { @Override @@ -1009,6 +1026,7 @@ public void run() { realm.commitTransaction(); RealmResults dogs = realm.where(Dog.class).findAll(); + looperThread.keepStrongReference.add(dogs); for (int i = 0; i < NUMBER_OF_LISTENERS; i++) { dogs.addChangeListener(new RealmChangeListener>() { @Override @@ -1049,6 +1067,7 @@ public void run() { RealmResults dogs = realm.where(Dog.class).findAllAsync(); assertTrue(dogs.load()); + looperThread.keepStrongReference.add(dogs); for (int i = 0; i < NUMBER_OF_LISTENERS; i++) { dogs.addChangeListener(new RealmChangeListener>() { @Override @@ -1096,6 +1115,7 @@ public void run() { realm.commitTransaction(); Dog dog = realm.where(Dog.class).findFirst(); + looperThread.keepStrongReference.add(dog); dog.addChangeListener(new RealmChangeListener() { @Override public void onChange(Dog object) { @@ -1168,6 +1188,7 @@ public void run() { }; Dog dog = realm.where(Dog.class).findFirstAsync(); + looperThread.keepStrongReference.add(dog); dog.addChangeListener(new RealmChangeListener() { @Override public void onChange(Dog object) { @@ -1214,6 +1235,7 @@ public void run() { realm.commitTransaction(); final RealmResults dogs = realm.where(Dog.class).findAll(); + looperThread.keepStrongReference.add(dogs); dogs.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults object) { @@ -1279,6 +1301,7 @@ public void run() { }; final RealmResults dogs = realm.where(Dog.class).findAllAsync(); + looperThread.keepStrongReference.add(dogs); dogs.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults object) { @@ -1426,6 +1449,8 @@ public void onChange(Object object) { finishedLatch.countDown(); } }; + looperThread.keepStrongReference.add(results1); + looperThread.keepStrongReference.add(results2); results1.addChangeListener(listener); results2.addChangeListener(listener); @@ -1451,6 +1476,7 @@ public void changeListener_onResultsBuiltOnDeletedLinkView() { final RealmResults dogs = allTypes.getColumnRealmList().where().equalTo(Dog.FIELD_NAME, "name_0").findAll(); + looperThread.keepStrongReference.add(dogs); dogs.addChangeListener(new RealmChangeListener>() { @Override public void onChange(RealmResults object) {