java.lang.ClassCastException: kotlinx.coroutines.Completable



我正在开发一个新的安卓应用程序,但我收到以下异常

java.lang.ClassCastException: kotlinx.coroutines.CompletableDeferredImpl cannot be cast to java.util.List
at yodgorbek.komilov.musobaqayangiliklari.viewmodel.MainViewModel$loadNews$1.invokeSuspend(MainViewModel.kt:42)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:241)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:201)
at android.app.ActivityThread.main(ActivityThread.java:6820)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:922)

在我的主视图模型.kt

在我的主视图模型.kt 下面

@Suppress("UNCHECKED_CAST")
class MainViewModel(val newsRepository: NewsRepository) : ViewModel(), CoroutineScope {
// Coroutine's background job
val job = Job()
// Define default thread for Coroutine as Main and add job
override val coroutineContext: CoroutineContext = Dispatchers.Main + job
val showLoading = MutableLiveData<Boolean>()
val sportList = MutableLiveData <List<Article>>()
val showError = SingleLiveEvent<String>()
fun loadNews() {
// Show progressBar during the operation on the MAIN (default) thread
showLoading.value = true
// launch the Coroutine
launch {
// Switching from MAIN to IO thread for API operation
// Update our data list with the new one from API
val result = withContext(Dispatchers.IO) {
newsRepository?.getNewsList()
}
// Hide progressBar once the operation is done on the MAIN (default) thread
showLoading.value = false
when (result) {
is UseCaseResult.Success<*> -> {
sportList.value = result.data as List<Article>
}
is Error -> showError.value = result.message
}
}
}
override fun onCleared() {
super.onCleared()
// Clear our job when the linked activity is destroyed to avoid memory leaks
job.cancel()
}
}

下面 文章.kt

@Entity(tableName = "news_table")
data class Article(@ColumnInfo(name = "author")val author: String,
val content: String,
val description: String,
val publishedAt: String,
val source: Source,
val title: String,
val url: String,
val urlToImage: String
)

以下 体育新闻回应.kt

数据类 体育新闻响应( 价值文章: 列表, 值状态:字符串, val totalResults: Int )

下面 UseCaseResult.kt

sealed class UseCaseResult<out T : Any>() {
class Success<out T : Any>(val data: T) : UseCaseResult<T>()
class Error(val exception: Throwable) : UseCaseResult<Nothing>()
}

在NewsRepository.kt下面,我已经实现了UserCaseResult

interface NewsRepository {
// Suspend is used to await 
suspend fun getNewsList(): UseCaseResult<List<Article>>
}

@Suppress("UNCHECKED_CAST")
class NewsRepositoryImpl(private val sportsNewsApi: SportNewsInterface) : NewsRepository {
override suspend fun getNewsList(): UseCaseResult<List<Article>> {
return try {
val result = sportsNewsApi.getNewsAsync()
UseCaseResult.Success(result) as UseCaseResult<List<Article>>
} catch (ex: Exception) {
UseCaseResult.Error(ex)
}
}
}

在我的下面 体育新闻Inteface.kt

interface SportNewsInterface {
@GET("v2/top-headlines?country=us&apiKey=da331087e3f3462bb534b3b0917cbee9")
fun getNewsAsync(): Deferred<SportNewsResponse>
@GET("/v2/top-headlines?sources=espn&apiKey=da331087e3f3462bb534b3b0917cbee9")
fun getEspn(): Deferred<List<SportNewsResponse>>
@GET("/v2/top-headlines?sources=football-italia&apiKey=da331087e3f3462bb534b3b0917cbee9")
fun getFootballItalia(): Deferred<List<SportNewsResponse>>
@GET("/v2/top-headlines?sources=bbc-sport&apiKey=da331087e3f3462bb534b3b0917cbee9")
fun getBBCSport(): Deferred<List<SportNewsResponse>>

在我的服务器响应下方

{
"status": "ok",
"totalResults": 38,
"articles": [
{
"source": {
"id": "cnbc",
"name": "CNBC"
},
"author": "Holly Ellyatt",
"title": "Russia is now not the only pressing issue that NATO has to deal with - CNBC",
"description": "Heads of state and government are meeting in the U.K. this week for the 70th anniversary of the military alliance NATO.",
"url": "https://www.cnbc.com/2019/12/02/nato-summit-alliance-has-more-pressing-issues-than-russia-now.html",
"urlToImage": "https://image.cnbcfm.com/api/v1/image/106272467-1575218599700gettyimages-997112494.jpeg?v=1575218712",
"publishedAt": "2019-12-02T07:39:00Z",
"content": "US president Donald Trump is seen during his press conference at the 2018 NATO Summit in Brussels, Belgium on July 12, 2018.rnAs heads of state and government meet in the U.K. this week for the 70th anniversary of the military alliance NATO, discussions are l… [+8623 chars]"
},
{
"source": {
"id": null,
"name": "Chron.com"
},
"author": "Aaron Wilson",
"title": "Bill O'Brien gets game ball from Deshaun Watson after Texans' win over Patriots - Chron",
"description": "In an emotional moment, Texans coach Bill O'Brien was presented with the game ball by quarterback Deshaun Watson following a pivotal win over the New England Patriots.",
"url": "https://www.chron.com/sports/texans/article/Bill-O-Brien-Deshaun-Watson-Texans-Patriots-14874678.php",
"urlToImage": "https://s.hdnux.com/photos/01/07/23/50/18692664/3/rawImage.jpg",
"publishedAt": "2019-12-02T06:16:00Z",
"content": "<ul><li>Houston Texans head coach Bill O'Brien on the sidelines during the fourth quarter of an NFL game against the New England Patriots at NRG Stadium Sunday, Dec. 1, 2019, in Houston.rnHouston Texans head coach Bill O'Brien on the sidelines during the four… [+1583 chars]"

}
]
}

不正确:

val result = sportsNewsApi.getNewsAsync()

正确:

val result = sportsNewsApi.getNewsAsync().await()
val result = sportsNewsApi.getNewsAsync()
UseCaseResult.Success(result) as UseCaseResult<List<Article>>

该演员表非常可疑,因为即使没有它,它也应该可以工作。这意味着您的转换无效,从而导致您看到的错误。

所以你已经做了一些改变 现在getNewsAsync必须返回UseCaseResult而不是它的列表,因为这就是端点返回的内容。 然后你可以获取这个对象内的文章

inNewsRepository在这 2 行中

val result = sportsNewsApi.getNewsAsync()
UseCaseResult.Success(result) as UseCaseResult<List<Article>>

您正在尝试将result投射到UseCaseResult<List<Article>>,但是SportNewsInterfacegetNewsAsync()乐趣又回来了Deferred<SportNewsResponse>因此您必须像这样将其投射到UseCaseResult<Deferred<SportNewsResponse>>

UseCaseResult.Success(result) as UseCaseResult<Deferred<SportNewsResponse>>

或者如果你想获取值,在这样的getNewsAsync()上使用.await()

val result = sportsNewsApi.getNewsAsync().await()
UseCaseResult.Success(result) as UseCaseResult<SportNewsResponse>

不要忘记现在您应该将结果投射到UseCaseResult<SportNewsResponse>并删除Deferred

相关内容

  • 没有找到相关文章

最新更新