gpt4 book ai didi

android - 如何在 MVVM 架构中使用协同程序进行改造

转载 作者:行者123 更新时间:2023-12-03 10:15:34 24 4
gpt4 key购买 nike

我在包含存储库和 repositoryImpl 包的 MVVM 架构中使用改造和 rxjava 进行项目。我想删除 rxjava 并在这个项目中使用 Kotlin 协程。
但是在搜索并阅读了从 rxjava 迁移到协程的文章后,我没有找到正确而干净的方法。请帮我实现这部分,用 rxjava 实现,用协程实现

我的项目服务.kt:

 @POST("/user/login")
fun login(@Body agentModel: AgentModel): Observable<APIResultModel<AgentModel>>

存储库.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)
}
}

}

存储库.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 -> {

}
}
}

谢谢你的帮助。

最佳答案

您可以使用“暂停”关键字从改造 api 函数返回您的类型。如果您想从存储库中删除 rx Observables。但是你需要记住:“coroutine = Single”。你不能像 Flowable 那样使用它。如果你愿意,我可以为你分享我的项目。我已经将 rx 更改为 coroutines 那里。

关于android - 如何在 MVVM 架构中使用协同程序进行改造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61045828/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com