如何从资源中设置翻新网址字符串

时间:2019-05-29 11:23:01

标签: android kotlin retrofit2

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

  

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

这是我的代码:

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

谁能告诉我出什么问题了吗?

在以下帖子中找到了答案。

3 个答案:

答案 0 :(得分:1)

如文档所述,它将在构建时编译您的应用程序资源。注释处理在编译时进行。因此,您看到无法将资源字符串传递给注释

  

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

相反,创建静态字符串变量并将其传递给注释

答案 1 :(得分:0)

基于提供的示例-最好只使用静态URL。为了避免使用任何运行时值并能够在运行时对其进行更改,将需要对此进行类似的注释:

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

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

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

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

答案 2 :(得分:0)

问题解决了, Tnx到Retrofit 2 - Dynamic URL

我不得不使用另一个改型的注释标记。

  

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

这是结果:

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

}