Skip to content

Commit 373b5a2

Browse files
authored
Merge pull request #1525 from OneSignal/fix/remove_observer_weak_ref_handling
Fix removeObserver WeakReference Handling
2 parents 4b394e2 + 1d3d363 commit 373b5a2

File tree

3 files changed

+26
-0
lines changed

3 files changed

+26
-0
lines changed

OneSignalSDK/onesignal/src/main/java/com/onesignal/OSObservable.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ void addObserverStrong(ObserverType observer){
5555
void removeObserver(ObserverType observer) {
5656
for(int i = 0; i < observers.size(); i++) {
5757
Object anObserver = ((WeakReference)observers.get(i)).get();
58+
if (anObserver == null) continue;
5859
if (anObserver.equals(observer)) {
5960
observers.remove(i);
6061
break;

OneSignalSDK/unittest/src/test/java/com/onesignal/OneSignalPackagePrivateHelper.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -824,4 +824,18 @@ public OSNotification build() {
824824
}
825825
}
826826
}
827+
828+
public static class OSObservable<ObserverType, StateType> extends com.onesignal.OSObservable<ObserverType, StateType> {
829+
public OSObservable(String methodName, boolean fireOnMainThread) {
830+
super(methodName, fireOnMainThread);
831+
}
832+
833+
public void addObserver(ObserverType observer) {
834+
super.addObserver(observer);
835+
}
836+
837+
public void removeObserver(ObserverType observer) {
838+
super.removeObserver(observer);
839+
}
840+
}
827841
}

OneSignalSDK/unittest/src/test/java/com/test/onesignal/MainOneSignalClassRunner.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@
113113
import org.robolectric.shadows.ShadowConnectivityManager;
114114
import org.robolectric.shadows.ShadowLog;
115115

116+
import java.lang.ref.WeakReference;
116117
import java.lang.reflect.Field;
117118
import java.util.ArrayList;
118119
import java.util.Arrays;
@@ -136,6 +137,7 @@
136137
import static com.onesignal.OneSignalPackagePrivateHelper.OneSignal_setTime;
137138
import static com.onesignal.OneSignalPackagePrivateHelper.OneSignal_setTrackerFactory;
138139
import static com.onesignal.OneSignalPackagePrivateHelper.OneSignal_taskQueueWaitingForInit;
140+
import static com.onesignal.OneSignalPackagePrivateHelper.OSObservable;
139141
import static com.onesignal.ShadowOneSignalRestClient.EMAIL_USER_ID;
140142
import static com.onesignal.ShadowOneSignalRestClient.PUSH_USER_ID;
141143
import static com.onesignal.ShadowOneSignalRestClient.REST_METHOD;
@@ -3455,6 +3457,15 @@ public void shouldNotFireSMSSubscriptionObserverOnAppRestart() throws Exception
34553457
assertNull(lastSMSSubscriptionStateChanges);
34563458
}
34573459

3460+
@Test
3461+
public void shouldNotThrowWhenRemovingWeakReferenceObservableThatHasBeenGarbageCollected() {
3462+
OSObservable<Object, Object> observer = new OSObservable<>("", false);
3463+
WeakReference<Object> weakObject = new WeakReference<>(new Object());
3464+
observer.addObserver(weakObject.get());
3465+
Runtime.getRuntime().gc(); // Force cleaning up WeakReference above
3466+
observer.removeObserver(weakObject.get());
3467+
}
3468+
34583469
@Test
34593470
public void shouldGetCorrectCurrentEmailSubscriptionState() throws Exception {
34603471
OneSignalInit();

0 commit comments

Comments
 (0)