【问题标题】:Kotlin Json parsing MVVMKotlin Json 解析 MVVM
【发布时间】:2019-11-11 20:10:31
【问题描述】:

我正在尝试学习使用协程将 Json 解析为 MVVM 中的 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 做的 有人可以指导我哪里出错以及如何解决它?

【问题讨论】:

  • 错误是什么?
  • 我在这一行 (.name) 上收到错误“未解析的引用”: if (mBlogWrapper != null && mBlogWrapper.name != null) { character = mBlogWrapper.name as MutableList mutableLiveData.value=字符; }

标签: android kotlin mvvm gson kotlin-coroutines


【解决方案1】:

您的 getPopularBlog() API 返回 List&lt;ABCCharacters&gt; 而不是 ABCCharacters。因此,您无法直接从您的回复中访问ABCCharacters 的属性。这就是为什么name 属性在这里显示Unresolved reference

试试下面的代码:

if (mBlogWrapper != null && mBlogWrapper.isNotEmpty()) {
    character = mBlogWrapper as MutableList<ABCCharacters>
    mutableLiveData.value = character
}

【讨论】:

  • 嘿@GK007,你检查答案了吗?
  • 谢谢。错误现在消失了,但是没有错误的黑屏。可能是什么问题?
  • 调试你的代码并检查mBlogWrapper 是否为空。我检查了您链接源中的示例数据,发现一切正常。如果你分享你的 api 那么我可以检查
  • 您在这篇文章中的示例 json 和 API json 不一样。那么它如何与您的上述代码一起使用?
  • 我还需要您的 Activity/Fragment 代码,您可以在其中使用适配器初始化 RecyclerView
【解决方案2】:

您的响应返回 List,但您想检查单个对象值 (mBlogWrapper.name != null)。您的代码不需要此行。在示例中,他检查了“响应”是否不是“空”以及博客列表是否不为空。再次分析示例;)

如果您仍然有问题,请告诉我

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 2017-08-13
    • 1970-01-01
    • 2020-11-04
    相关资源
    最近更新 更多