尽管我从 udacity 获得了另一个代码并且我完全按照在那里完成的方式进行了几天,但仍然出现相同的错误。我错过了什么吗?
I have searched everywhere and tried many ways to solve this problem but i still get the same error "requires explicit JsonAdapter to be registered".
I tried rebuild project, sync with file system, delete the dependencies and sync again BUT it never worked.
数据类
import android.os.Parcelable
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import kotlinx.android.parcel.Parcelize
@Parcelize
data class Post(
@Json(name = "id") var postId: Int,
val title: String,
val userId: Int,
val postDate: String,
val location: String,
@Json(name = "pictureUrl") val picture: String
) : Parcelable
Run Code Online (Sandbox Code Playgroud)
I also tried to use @JsonClass(generateAdapter = true) but it did not work
api服务类
import android.example.kliekje.data.Post
import com.jakewharton.retrofit2.adapter.kotlin.coroutines.CoroutineCallAdapterFactory
import com.squareup.moshi.Moshi
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
import retrofit2.Retrofit
import retrofit2.converter.moshi.MoshiConverterFactory
import retrofit2.http.GET
import kotlinx.coroutines.Deferred
private const val BASE_URL = " https://ahmad.ysebie.be/"
private val moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
private val retrofit = Retrofit.Builder()
.addConverterFactory(MoshiConverterFactory.create(moshi))
.addCallAdapterFactory(CoroutineCallAdapterFactory())
.baseUrl(BASE_URL)
.build()
interface PostApiService {
@GET("api/post")
fun getProperties():
// The Coroutine Call Adapter allows us to return a Deferred, a Job with a result
Deferred<List<Post>>
}
object PostApi {
val retrofitService : PostApiService by lazy { retrofit.create(PostApiService::class.java) }
}
Run Code Online (Sandbox Code Playgroud)
Here how i get to the api data
ViewModel 帖子类
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.example.android.marsrealestate.network.PostApi
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
enum class PostApiStatus { LOADING, ERROR, DONE }
class PostsOverviewViewModel : ViewModel(){
private val _response = MutableLiveData<String>()
val response: LiveData<String>
get() = _response
private var viewModelJob = Job()
private val coroutineScope = CoroutineScope(viewModelJob + Dispatchers.Main)
init {
getPosts()
}
private fun getPosts() {
coroutineScope.launch {
var getPropertiesDeferred = PostApi.retrofitService.getProperties()
try {
var listResult = getPropertiesDeferred.await()
_response.value = "succes " + listResult?.size + "posts"
}
catch(t: Throwable){
_response.value = "Failure: " + t.message
}
}
}
override fun onCleared() {
super.onCleared()
viewModelJob.cancel()
}
}
Run Code Online (Sandbox Code Playgroud)
ViewModel post class
编辑文本
<EditText
android:text="@{viewModel.response}"
/>
Run Code Online (Sandbox Code Playgroud)
For now i only want to show the size of the list that get from the Api
我一直得到的例外
E/AndroidRuntime: FATAL EXCEPTION: main
Process: android.example.kliekje, PID: 23179
java.lang.IllegalArgumentException: Unable to create converter for java.util.List<android.example.kliekje.data.Post>
for method PostApiService.getProperties
at retrofit2.Utils.methodError(Utils.java:52)
at retrofit2.HttpServiceMethod.createResponseConverter(HttpServiceMethod.java:70)
at retrofit2.HttpServiceMethod.parseAnnotations(HttpServiceMethod.java:46)
at retrofit2.ServiceMethod.parseAnnotations(ServiceMethod.java:36)
at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:168)
at retrofit2.Retrofit$1.invoke(Retrofit.java:147)
at java.lang.reflect.Proxy.invoke(Proxy.java:1006)
at $Proxy2.getProperties(Unknown Source)
at android.example.kliekje.posts_overview.PostsOverviewViewModel$getPosts$1.invokeSuspend(PostsOverviewViewModel.kt:33)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:233)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.IllegalArgumentException: Platform class android.example.kliekje.data.Post (with no annotations) requires explicit JsonAdapter to be registered
for class android.example.kliekje.data.Post
for java.util.List<android.example.kliekje.data.Post>
at com.squareup.moshi.Moshi$LookupChain.exceptionWithLookupStack(Moshi.java:348)
at com.squareup.moshi.Moshi.adapter(Moshi.java:149)
at com.squareup.moshi.Moshi.adapter(Moshi.java:97)
at com.squareup.moshi.Moshi.adapter(Moshi.java:67)
at com.squareup.moshi.CollectionJsonAdapter.newArrayListAdapter(CollectionJsonAdapter.java:52)
at com.squareup.moshi.CollectionJsonAdapter$1.create(CollectionJsonAdapter.java:36)
at com.squareup.moshi.Moshi.adapter(Moshi.java:137)
at com.squareup.moshi.Moshi.adapter(Moshi.java:97)
at retrofit2.converter.moshi.MoshiConverterFactory.responseBodyConverter(MoshiConverterFactory.java:91)
at retrofit2.Retrofit.nextResponseBodyConverter(Retrofit.java:328)
at retrofit2.Retrofit.responseBodyConverter(Retrofit.java:311)
at retrofit2.HttpServiceMethod.createResponseConverter(HttpServiceMethod.java:68)
... 16 more
Caused by: java.lang.IllegalArgumentException: Platform class android.example.kliekje.data.Post (with no annotations) requires explicit JsonAdapter to be registered
at com.squareup.moshi.ClassJsonAdapter$1.create(ClassJsonAdapter.java:60)
at com.squareup.moshi.Moshi.adapter(Moshi.java:137)
... 26 more
Run Code Online (Sandbox Code Playgroud)
有人可以帮我解决这个问题,因为我已经被困了几天了!谢谢大家