فهرست منبع

CurrentUserProviderImpl: ensure only one observer is set up for all threads

Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
Álvaro Brey 2 سال پیش
والد
کامیت
2e2d4a9ca3
1فایلهای تغییر یافته به همراه9 افزوده شده و 2 حذف شده
  1. 9 2
      app/src/main/java/com/nextcloud/talk/utils/database/user/CurrentUserProviderImpl.kt

+ 9 - 2
app/src/main/java/com/nextcloud/talk/utils/database/user/CurrentUserProviderImpl.kt

@@ -31,7 +31,12 @@ import javax.inject.Inject
  * Listens to changes in the database and provides the current user without needing to query the database everytime.
  */
 class CurrentUserProviderImpl @Inject constructor(private val userManager: UserManager) : CurrentUserProviderNew {
+
     private var _currentUser: User? = null
+
+    // synchronized to avoid multiple observers initialized from different threads
+    @get:Synchronized
+    @set:Synchronized
     private var currentUserObserver: Disposable? = null
 
     override val currentUser: Maybe<User>
@@ -40,8 +45,10 @@ class CurrentUserProviderImpl @Inject constructor(private val userManager: UserM
                 // immediately get a result synchronously
                 _currentUser = userManager.currentUser.blockingGet()
                 if (currentUserObserver == null) {
-                    // start observable for auto-updates
-                    currentUserObserver = userManager.currentUserObservable.subscribe { _currentUser = it }
+                    currentUserObserver = userManager.currentUserObservable
+                        .subscribe {
+                            _currentUser = it
+                        }
                 }
             }
             return _currentUser?.let { Maybe.just(it) } ?: Maybe.empty()