Kotlin Json, разбор MVVM - PullRequest
       108

Kotlin Json, разбор MVVM

0 голосов
/ 11 ноября 2019

Я пытаюсь изучить архитектуру MVVM при анализе Json в Recyclerview в MVVM с использованием сопрограмм. Но я получаю сообщение об ошибке в классе BlogRepository.

Мой файл Json выглядит следующим образом:

[
  {
    "id": 1,
    "name": "potter",
    "img": "https://images.example.com/potter.jpg"
},
{ …}
]

Я создал класс данных, как показано ниже:

@JsonClass(generateAdapter = true)
class ABCCharacters (

    @Json(name = "id") val char_id: Int,
    @Json(name = "name") val name: String? = null,
    @Json(name = "img") val img: String
)

ЗатемRestApiService, как показано ниже:

interface RestApiService {

    @GET("/api")
    fun getPopularBlog(): Deferred<List<ABCCharacters>>

    companion object {

        fun createCorService(): RestApiService {

            val okHttpClient = OkHttpClient.Builder()
                .connectTimeout(1, TimeUnit.MINUTES)
                .readTimeout(30, TimeUnit.SECONDS)
                .writeTimeout(15, TimeUnit.SECONDS)
                .build()

            return Retrofit.Builder()
                .baseUrl("https://example.com")
                .addConverterFactory(MoshiConverterFactory.create())
                .client(okHttpClient)
                .addCallAdapterFactory(CoroutineCallAdapterFactory())
                .build().create(RestApiService::class.java)
        }
    }
}

BlogReposity.kt

class BlogRepository() {

    private var character = mutableListOf<ABCCharacters>()
    private var mutableLiveData = MutableLiveData<List<ABCCharacters>>()
    val completableJob = Job()
    private val coroutineScope = CoroutineScope(Dispatchers.IO + completableJob)

    private val thisApiCorService by lazy {
        RestApiService.createCorService()
    }

    fun getMutableLiveData():MutableLiveData<List<ABCCharacters>> {
        coroutineScope.launch {
            val request = thisApiCorService.getPopularBlog()
            withContext(Dispatchers.Main) {
                try {

                    val response = request.await()
                    val mBlogWrapper = response;
                    if (mBlogWrapper != null && mBlogWrapper.name != null) {
                        character = mBlogWrapper.name as MutableList<ABCCharacters>
                        mutableLiveData.value=character;
                    }

                } catch (e: HttpException) {
                    // Log exception //

                } catch (e: Throwable) {
                    // Log error //)
                }
            }
        }
        return mutableLiveData;
    }
}

Наконец, класс ViewModel

class MainViewModel() : ViewModel() {

    val characterRepository= BlogRepository()
    val allBlog: LiveData<List<ABCCharacters>> get() = characterRepository.getMutableLiveData()

    override fun onCleared() {
        super.onCleared()
        characterRepository.completableJob.cancel()
    }
}

Я сделал это на основе https://itnext.io/kotlin-wrapping-your-head-around-livedata-mutablelivedata-coroutine-networking-and-viewmodel-b552c3a74eec Кто-то может подсказать мне, где я ошибаюсь и как это исправить?

Ответы [ 2 ]

0 голосов
/ 12 ноября 2019

Ваш getPopularBlog() API возврат List<ABCCharacters> вместо ABCCharacters. Таким образом, вы не можете получить доступ к свойству ABCCharacters непосредственно из своего ответа. Вот почему name свойство здесь показывает Unresolved reference.

Попробуйте код ниже:

if (mBlogWrapper != null && mBlogWrapper.isNotEmpty()) {
    character = mBlogWrapper as MutableList<ABCCharacters>
    mutableLiveData.value = character
}
0 голосов
/ 12 ноября 2019

Ваш ответ возвращает List, но вы хотите проверить значение одного объекта (mBlogWrapper.name! = Null). Вам не нужна эта строка в вашем коде. В этом примере он проверил, является ли «response» не «null» и не является ли список блогов null. Проанализируйте пример еще раз;)

, если у вас все еще есть проблема, дайте мне знать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...