【发布时间】:2020-07-17 15:02:11
【问题描述】:
我在一个包含存储库和repositoryImpl 包的MVVM 架构中使用retrofit 和rxjava 开展项目。我想删除 rxjava,只为这个项目使用 Kotlin 协程。 但是在搜索并阅读了从 rxjava 迁移到协程的文章后,我没有找到正确且干净的方法。请帮我实现这部分用 rxjava 实现的协程实现
MyProjectService.kt:
@POST("/user/login")
fun login(@Body agentModel: AgentModel): Observable<APIResultModel<AgentModel>>
Repository.kt:
interface Repository {
fun login(
context: Context,
userModel: AgentModel,
callback: (Result<APIResultModel<AgentModel>, RaakebException>) -> Unit
RepositoryImpl.kt:
class RepositoryImpl : Repository {
private val api = RaakebApi.instance
private val prefs by lazy {
UserPreferences()
}
override fun login(
context: Context,
userModel: AgentModel,
callback: (Result<APIResultModel<AgentModel>, RaakebException>) -> Unit
) {
val error = showError(callback)
val result = Consumer<APIResultModel<AgentModel>> { agent ->
prefs.token = agent.apiObjects.token.toString()
callback(Result.Success(agent))
}
val hashMap = HashMap<String, Any>()
val deviceModel = DeviceModel()
deviceModel.uniqueID = DeviceInfoHelper.getDeviceUniqueID(context)
deviceModel.appVersion = DeviceInfoHelper.getAppVersion()
deviceModel.platform = "ANDROID"
deviceModel.sdkVersion = DeviceInfoHelper.getSDKVersion()
deviceModel.phoneBrand = DeviceInfoHelper.getPhoneBrand()
deviceModel.phoneModel = DeviceInfoHelper.getPhoneModel()
//deviceModel.notificationID = Rakeeb.prefs.notification_id
hashMap["user"] = userModel
hashMap["device"] = deviceModel
api.login(userModel)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(result, error)
}
我尝试过,但它是错误的。而且我不知道我必须如何解决它。
MyProjectService.kt:
interface MyProjectService {
@POST("/user/login")
suspend fun login(@Body agentModel: AgentModel): Result<APIResultModel<AgentModel>, RaakebException>
companion object {
private val prefs by lazy {
UserPreferences()
}
val instance: RaakebApi by lazy {
val builder = OkHttpClient.Builder()
builder.addInterceptor {
val requestBuilder = it.request().newBuilder()
if (!it.request().url().url().path?.contains("/user/login")!!) {
requestBuilder.addHeader("auth", prefs.token)
}
requestBuilder.addHeader("Content-Type", "application/json")
it.proceed(requestBuilder.build())
}
builder.readTimeout(30, TimeUnit.SECONDS)
builder.connectTimeout(30, TimeUnit.SECONDS)
val client = builder.build()
val retrofitBuilder: Retrofit.Builder = Retrofit.Builder()
.client(client)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addCallAdapterFactory(CoroutineCallAdapterFactory())
return@lazy retrofitBuilder.baseUrl(ConstHelper.SERVER_URL)
.addConverterFactory(GsonConverterFactory.create()).build()
.create(RaakebApi::class.java)
}
}
}
Repository.kt:
interface Repository {
suspend fun login(
context: Context,
userModel: AgentModel
) : Result<APIResultModel<AgentModel>, RaakebException>
companion object {
val instance: Repository by lazy {
RepositoryImpl()
}
}
RepositoryImpl.kt:
class RepositoryImpl : Repository {
private val api = RaakebApi.instance
private val prefs by lazy {
UserPreferences()
}
override suspend fun login(
context: Context,
userModel: AgentModel
): Result<APIResultModel<AgentModel>, RaakebException> = withContext(Dispatchers.IO) {
when (val response = api.login(userModel)) {
is Result.Success -> {
/* val hashMap = HashMap<String, Any>()
val deviceModel = DeviceModel()
deviceModel.uniqueID = DeviceInfoHelper.getDeviceUniqueID(context)
deviceModel.appVersion = DeviceInfoHelper.getAppVersion()
deviceModel.platform = "ANDROID"
deviceModel.sdkVersion = DeviceInfoHelper.getSDKVersion()
deviceModel.phoneBrand = DeviceInfoHelper.getPhoneBrand()
deviceModel.phoneModel = DeviceInfoHelper.getPhoneModel()
//deviceModel.notificationID = Rakeeb.prefs.notification_id
hashMap["user"] = userModel
hashMap["device"] = deviceModel*/
return@withContext response.success
}
is Result.Error -> {
}
}
}
感谢您的帮助。
【问题讨论】:
标签: android mvvm repository rx-java coroutine