【问题标题】:Elegant way of validating permission in Android using MVVM使用 MVVM 在 Android 中验证权限的优雅方式
【发布时间】:2019-02-06 06:26:40
【问题描述】:

所以,我使用 MVVM 架构和 Repository 模式来进行不同的 API 调用。 我有一个名为 X 的存储库,其中有不同的相关 API 调用。

在进行任何这些调用之前,我想进行验证。如果成功进行,则仅应发出网络请求。

fun getSomethingX(data: Data): Single<Data> {
    return if (validation(data)) {
        service.getSomethingX()
                .onErrorResumeNext(...)
                .map { ... ->
                    ...
                }
    } else {
        Single.just(null)
    }
}

fun getSomethingY(data: Data): Single<Data> {
    return if (validation(data)) {
        service.getSomethingX()
                .onErrorResumeNext(...)
                .map { ... ->
                    ...
                }
    } else {
        Single.just(null)
    }
 } 

如您所见,我可能有许多名为getSomething..() 的网络请求函数。我认为这是一个样板代码。

  1. 是否有其他处理验证的方法(不仅是令牌验证,还有一般的权限)?如果是这样,你能给我举个例子吗?

  2. 是否可以在 Repository 级别进行权限验证?

  3. 也许更好的方法是在Interceptor 中进行验证?但是,如果验证未通过,我看不到取消请求的干净方法。

【问题讨论】:

    标签: android kotlin retrofit2 rx-java2


    【解决方案1】:

    更好的方法是仅在存储库级别进行验证,并尽可能保持视图模型哑。 Kotlin’s Function literals with receiver 非常简单。

    在您的存储库中

    fun getSomethingX(
       data: Data,
       onSuccess: (Single<Data>) -> Unit,
       onError: (String) -> Unit
    ) {
       if (validation(data)) {
          // Do the network call 
          onSuccess(//pass result)
       } else onError(“Invalid data”)
    } 
    

    在您的视图模型中

    repository.getSomethingX(
       data,
       onSuccess = {
            //it will give you Single<Data>
            //Update the value
        },
        onError = {
            //Emit error to view 
        }
    )
    

    【讨论】:

      猜你喜欢
      • 2011-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-14
      相关资源
      最近更新 更多