未解决的参考:创建改造实例时进行改造

问题描述 投票:0回答:4

我正在开发一个 Android 应用程序,它请求火星照片并使用它在屏幕上显示它。 发出请求。并尝试使用公开延迟初始化的 Retrofit 服务的公共 Api 对象。 下面是有错误的源代码

import retrofit2.Retrofit
import retrofit2.converter.scalars.ScalarsConverterFactory
import retrofit2.http.GET

class MarsApiService {
    public val retrofit = Retrofit.Builder()
    .addConverterFactory(ScalarsConverterFactory.create())
    .baseUrl(Companion.BASE_URL)
    .build()
interface MarsApiService{
    @GET("photos")
    fun getPhotos(): String
}
object MarsApi {
    val retrofitService: MarsApiService by lazy { retrofit.create(MarsApiService::class.java) }
}



companion object {
    private const val BASE_URL = "https://android-kotlin-fun-mars-server.appspot.com"
}
}

第17行对象MarsApi内的代码弹出错误未解决的参考:改造。在 Retrofit 对象上调用 create() 函数的成本很高,并且应用程序只需要一个 Retrofit API 服务实例。因此,我使用对象声明将该服务公开给应用程序的其余部分。

我尝试过的:

如果我将 MarsApi 对象内的代码带出,代码就可以工作,但这样做可能会导致多个实例的改造。

android-studio kotlin retrofit
4个回答
0
投票

代码1

interface MarsApiService {
    @GET("photos")
   suspend fun getPhotos(): String

    companion object {
        private const val BASE_URL = "https://android-kotlin-fun-mars-server.appspot.com"
        val marsApiService: MarsApiService by lazy {
            Retrofit.Builder()
                .addConverterFactory(ScalarsConverterFactory.create())
                .baseUrl(BASE_URL)
                .build().create(MarsApiService::class.java)
        }
    }
}

代码2

private const val BASE_URL = "https://android-kotlin-fun-mars-server.appspot.com/"

private val retrofit = Retrofit.Builder()
    .addConverterFactory(ScalarsConverterFactory.create())
    .baseUrl(BASE_URL)
    .build()

interface MarsApiService {

    @GET("photos")
    suspend fun getPhotos(): String
}

object MarsApi {
    val marsApiService: MarsApiService by lazy { retrofit.create(MarsApiService::class.java) }
}

奔跑


fun main() = runBlocking {
    val rs = marsApiService.getPhotos()
    println(rs)
}

在您的代码中,

retrofit
通过惰性引用未解决
retrofit
的原因是
property
class
,像使用
retrofit
一样全局移动
(Companion) object
或像code2(最高层次结构?)


0
投票

希望此链接

让你清楚对象和伴生对象之间的区别以及何时使用它们。快乐学习


0
投票

这和我遇到的问题是一样的。 我解决了这个问题,只是排除了班级

MarsApiService
我也没用过
companion object

正确的代码在下面

import retrofit2.Retrofit
import retrofit2.converter.scalars.ScalarsConverterFactory
import retrofit2.http.GET

private const val BASE_URL = "https://android-kotlin-fun-mars-server.appspot.com"

public val retrofit = Retrofit.Builder()
    .addConverterFactory(ScalarsConverterFactory.create())
    .baseUrl(Companion.BASE_URL)
    .build()

interface MarsApiService{
    @GET("photos")
    fun getPhotos(): String
}

object MarsApi {
    val retrofitService: MarsApiService by lazy { 
        retrofit.create(MarsApiService::class.java) 
    }
}


0
投票

там в уроке надо было файл создать а не класс

© www.soinside.com 2019 - 2024. All rights reserved.