【发布时间】:2021-05-20 09:05:10
【问题描述】:
我正在使用 Kotlin 的改造和使用 MVVM 模式的协程。这是我第一次使用改造和 kotlin。我的问题是我正在调用新闻 api 并收到此错误,即使我已经尝试自己解决我的问题但没有得到任何适当的解决方案。
Json 响应:
{
"status": "ok",
"totalResults": 3923,
-"articles": [
-{
-"source": {
"id": null,
"name": "Finextra"
},
"author": "Editorial Team",
"title": "Solaris Digital Assets wins Bitwala as digital asset custody partner",
"description": "Solaris Digital Assets GmbH, a 100% subsidiary of Solarisbank AG, today announced that it has won Bitwala, Germany’s crypto-banking flagship company, as a partner for its digital asset custody solution.",
"url": "https://www.finextra.com/pressarticle/85033/solaris-digital-assets-wins-bitwala-as-digital-asset-custody-partner",
"urlToImage": "https://www.finextra.com/about/finextra-logo-alt-16-9.jpg",
"publishedAt": "2020-11-17T14:28:00Z",
"content": "Solaris Digital Assets GmbH, a 100% subsidiary of Solarisbank AG, today announced that it has won Bitwala, Germanys crypto-banking flagship company, as a partner for its digital asset custody solutio… [+3321 chars]"
},
-{
-"source": {
"id": null,
"name": "Seeking Alpha"
},
"author": "Ophelia Research",
"title": "Power Corporation Of Canada Is Still A Buy",
"description": "Wealthsimple continues to grow through social media platforms and referral incentives. Power Corporation of Canada continues to grow its investments in start-ups.",
"url": "https://seekingalpha.com/article/4389643-power-corporation-of-canada-is-still-buy",
"urlToImage": "https://static2.seekingalpha.com/uploads/2020/11/15/saupload_EWZQEwLYN4dxnan8QPFcRnpuNy_nvcN-PV5mrbjb97co4v9-QgGK8ZN8UqwxzO3oSPoiDkwnvSMFsyqKGu06-S1TGHHydTAz8VkQXaY5-FjSbTa5-qzCROck4sPk2ZeSD6rYIL1P.png",
"publishedAt": "2020-11-17T14:21:26Z",
"content": "Power Corporation of Canada (OTCPK:PWCDF) is a diversified financial services company that pays out solid dividends due to strong established brands and still has the potential for growth given its i… [+6824 chars]"
}]}
改造建造者:
object RetrofitBuilder {
private const val BASE_URL = "http://newsapi.org/v2/"
private fun getRetrofit(): Retrofit {
return Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build() //Doesn't require the adapter
}
val apiService: ApiService = getRetrofit().create(ApiService::class.java)
}
API接口:
interface ApiService {
@GET("sources/apikey")
suspend fun getTopHeadlines(): Model
}
API 助手:
suspend fun getTopHeadlines() = apiService.getTopHeadlines()
主存储库:
suspend fun getTopHeadlines() = apiHelper.getTopHeadlines()
ViewModelFactory:
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(MainViewModel::class.java)) {
return MainViewModel(MainRepository(apiHelper)) as T
}
throw IllegalArgumentException("Unknown class name")
}
主视图模型:
fun getTopHeadlines() = liveData(Dispatchers.IO) {
emit(Resource.loading(data = null))
try {
emit(Resource.success(data = mainRepository.getTopHeadlines()))
} catch (exception: Exception) {
emit(Resource.error(data = null, msg = exception.message ?: "Error Occurred!"))
}
}
模型类:
data class Model(val status: String,val totalResults: Int,val articles: List<Article>)
文章分类:
data class Article(
val source: Source,
val author: String,
val content: String,
val description: String,
val publishedAt: String,
val title: String,
val url: String,
val urlToImage: String
)
源类:
data class Source(
val id: Any,
val name: String
)
主要活动:
viewModel.getTopHeadlines().observe(this, Observer {
it?.let { resource ->
when (resource.status) {
Status.SUCCESS -> {
Log.e("MainClass","Data caught: "+it.message);
// resource.data?.let { users -> retrieveList(users) }
}
Status.ERROR -> {
Log.e("MainClass","Exception caught: "+it.message);
Toast.makeText(this, it.message, Toast.LENGTH_LONG).show()
}
Status.LOADING -> {
}
}
}
})
【问题讨论】:
-
mmm...您获取模型数据的方法看起来不错,因为 json 以“{”开头,所以它是一个对象,而不是一个数组...所以请使用 Verbose 检查日志带有键“okhttp”的模式,您的响应是 200... 并使用 try catch 和改造 try { yourCall } catch(例如:HttpException 和 IOException 来处理互联网连接,如果你愿意)