Skip to content

Commit 8d5e998

Browse files
author
Mark TBL
committed
🔨 Update DefaultUserrepository Codebase as cache not working before
1 parent a439c18 commit 8d5e998

File tree

2 files changed

+26
-15
lines changed

2 files changed

+26
-15
lines changed

app/src/main/java/com/coxtunes/androidarchitecturekotlin2021/common/di/AppModule.kt

+11-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ import dagger.Provides
1212
import dagger.hilt.InstallIn
1313
import dagger.hilt.components.SingletonComponent
1414
import kotlinx.coroutines.CoroutineDispatcher
15+
import kotlinx.coroutines.CoroutineScope
1516
import kotlinx.coroutines.Dispatchers
17+
import kotlinx.coroutines.SupervisorJob
1618
import okhttp3.OkHttpClient
1719
import okhttp3.logging.HttpLoggingInterceptor
1820
import retrofit2.Retrofit
@@ -68,12 +70,19 @@ object AppModule {
6870
return retrofit.create(UsersApi::class.java)
6971
}
7072

73+
74+
@Provides
75+
fun provideCoroutinesScope(dispatcher: DispatcherProvider): CoroutineScope {
76+
return CoroutineScope(SupervisorJob() + dispatcher.default)
77+
78+
}
79+
7180
@Singleton
7281
@Provides
7382
fun provideUserRepository(
7483
remoteDataSource: UsersRemoteDataSource,
75-
dispatcher: DispatcherProvider
84+
externalScope: CoroutineScope
7685
): UserRepository {
77-
return DefaultUserRepository(remoteDataSource, dispatcher)
86+
return DefaultUserRepository(remoteDataSource, externalScope)
7887
}
7988
}
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
package com.coxtunes.androidarchitecturekotlin2021.data.repository
2+
23
import com.coxtunes.androidarchitecturekotlin2021.common.responseSealed.Resource
3-
import com.coxtunes.androidarchitecturekotlin2021.common.utility.DispatcherProvider
44
import com.coxtunes.androidarchitecturekotlin2021.data.remoteDataSource.UsersRemoteDataSource
55
import com.coxtunes.androidarchitecturekotlin2021.domain.repository.UserRepository
66
import com.coxtunes.androidarchitecturekotlin2021.domain.viewobjects.UsersViewItems
7+
import kotlinx.coroutines.CoroutineScope
8+
import kotlinx.coroutines.async
79
import kotlinx.coroutines.sync.Mutex
810
import kotlinx.coroutines.sync.withLock
9-
import kotlinx.coroutines.withContext
1011
import javax.inject.Inject
1112

1213
/**
1314
* @Author: Nayeem Shiddiki Abir
14-
* @Date: 28-Dec-21
1515
*/
1616
class DefaultUserRepository @Inject constructor(
1717
private val remoteDataSource: UsersRemoteDataSource,
18-
private val dispatcher: DispatcherProvider
18+
private val externalScope: CoroutineScope
1919
) : UserRepository {
2020

2121
// Mutex to make writes to cached values thread-safe.
@@ -25,15 +25,17 @@ class DefaultUserRepository @Inject constructor(
2525
private var latestUsersList: Resource<List<UsersViewItems>> = Resource.Empty()
2626

2727
override suspend fun getUsersList(refresh: Boolean): Resource<List<UsersViewItems>> {
28-
withContext(dispatcher.io) {
29-
val itemsRes = remoteDataSource.getUsers()
30-
31-
// Thread-safe write to latestNews
32-
latestUsersMutex.withLock {
33-
this@DefaultUserRepository.latestUsersList = itemsRes
34-
}
28+
return if (latestUsersList.data == null) {
29+
externalScope.async {
30+
remoteDataSource.getUsers().also { userlist ->
31+
// Thread-safe write to latestNews
32+
latestUsersMutex.withLock {
33+
this@DefaultUserRepository.latestUsersList = userlist
34+
}
35+
}
36+
}.await()
37+
} else {
38+
latestUsersMutex.withLock { latestUsersList }
3539
}
36-
return latestUsersMutex.withLock { latestUsersList }
3740
}
38-
3941
}

0 commit comments

Comments
 (0)