我正在开发一个 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 对象内的代码带出,代码就可以工作,但这样做可能会导致多个实例的改造。
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)
}
}
}
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(最高层次结构?)
希望此链接
让你清楚对象和伴生对象之间的区别以及何时使用它们。快乐学习
这和我遇到的问题是一样的。 我解决了这个问题,只是排除了班级
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)
}
}
там в уроке надо было файл создать а не класс