как использовать сопрограммы с модернизацией в архитектуре MVVM - PullRequest
2 голосов
/ 05 апреля 2020

Я работаю над проектом с модификацией и rx java в архитектуре MVVM, содержащей пакет repository и repositoryImpl. Я хочу удалить rx java и просто использовать Kotlin сопрограмму для этого проекта. но после поиска и прочтения статей по переходу с rx java на сопрограмму я не нашел правильного и чистого пути. пожалуйста, помогите мне реализовать этот раздел, который реализован с помощью rx java реализовать с сопрограммами

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 -> {

        }
    }
}

спасибо за вашу помощь.

1 Ответ

2 голосов
/ 05 апреля 2020

Вы можете вернуться из модифицированной API-функции вашего типа с помощью ключевого слова «suspend». Если вы хотите удалить rx Observables из репозиториев. Но вы должны помнить: "сопрограмма = Single". Вы не можете использовать его как Flowable. Если хочешь, я могу поделиться своим проектом для тебя. Я изменил rx на сопрограммы там.

...