【问题标题】:How to set Retrofit URL string from Resources如何从资源中设置改造 URL 字符串
【发布时间】:2019-05-29 11:23:00
【问题描述】:

我已经重构了我用 Kotlin 编写的代码的某些部分,并且倾向于将 url 放在 strings.xml 中,但是当我想在 Retrofit 的注释部分中指向 strings.xml 文件中的字符串时,我得到了以下错误。

注解参数必须是编译时常量

这是我的代码:

interface SampleApiService {
    @GET(Resources.getSystem().getString(R.string.sample_url))
    fun getSamples(){
    }
}

谁能告诉我怎么回事?

在下面的帖子中找到答案。

【问题讨论】:

标签: android kotlin retrofit2


【解决方案1】:

正如文档所述,它会在构建时编译您的应用程序资源。和注释处理发生在编译时。所以你看到你不能将资源字符串传递给注释

Android SDK 工具将应用程序的资源编译到 构建时的应用程序二进制文件。

改为创建静态字符串变量并在注释中传递它

【讨论】:

    【解决方案2】:

    问题解决了, 转至Retrofit 2 - Dynamic URL

    我不得不使用另一种改造的注释标记。

    新增:@Url 参数注释允许为端点传递完整的 URL。

    结果如下:

    interface SampleApiService {
        @GET
        fun getSamples(
            @Url url: String =
                Resources.getSystem().getString(R.string.sample_url)
        )
                : Deferred<ArrayList<Sample>>
    
    }
    

    【讨论】:

      【解决方案3】:

      根据提供的示例 - 也可以只使用静态 URL。为了不使用任何运行时值并能够在运行时更改它,它需要进行类似的注释:

      @GET("{path}")
      fun getSamples(@Path("path") path: String) {}
      

      然后可以在运行时从字符串资源中加载任何String path。当要更改基本 URL 时,可能需要重新配置客户端。那是因为注释处理器正在使用这个 interface 定义来从中生成抽象层 - 已经在编译时,而不是在运行时......当采用投诉文字时,它必须看起来像这样:

      @GET(Constants.SOME_PATH)
      fun getSamples() {}
      

      但与 String 的硬编码相比几乎没有什么进步,因为它以后无法更改。

      【讨论】:

        猜你喜欢
        • 2011-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多