【问题标题】:Android Kotlin Retrofit MVVM return NullAndroid Kotlin Retrofit MVVM 返回 Null
【发布时间】:2021-05-04 09:05:53
【问题描述】:

我目前正在制作一个关于图表的示例项目。我最近开始使用 MVVM 架构,当响应为空时我被卡住了。我还检查了可变实时数据以确保它正在调用 API。这是我的一些代码和错误标签:

Model.kt

data class Model(
    @SerializedName("FID") val FID: Int,
    @SerializedName("region") val region: String,
    @SerializedName("positive") val positive: Float
) {
}

ModelWrap.kt

data class ModelWrap(@SerializedName("samplesAPI") val attributes: Model){
}

ApiClient.kt

object ApiClient {
    var retrofitService: ApiInterface? = null
    const val BASE_URL = "https://sampleapi.../"

    fun getApiSample() : ApiInterface {
        if (retrofitService == null){
            val retrofit = Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build()
            retrofitService = retrofit.create(ApiInterface::class.java)
        }
        return retrofitService!!
    }
}

ApiInterface.kt

interface ApiInterface {
    @GET("samples")
    fun getSampleData(): Call<List<ModelWrap>>
}

MainViewModel.kt

class MainViewModelconstructor(private val repository: ModelRepository) : ViewModel(){
    val sampleList= MutableLiveData<List<ModelWrap>>()
    val errorMessage = MutableLiveData<String>()

    fun getSampleData(pieChart: PieChart){
        val response = repository.getSampleData()
        response.enqueue(object : Callback<List<ModelWrap>> {
            override fun onResponse(
                call: Call<List<ModelWrap>>,
                response: Response<List<ModelWrap>>
            ) {
                sampleList.postValue(response.body())
                
            }
            override fun onFailure(call: Call<List<ModelWrap>>, t: Throwable) {
                errorMessage.postValue(t.message)
            }

        })
    }
}

MainViewModelFactory.kt

class MainViewModelFactoryconstructor(private val repository: MainRepository) : ViewModelProvider.Factory {
    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        return  if (modelClass.isAssignableFrom(MainViewModel::class.java)){
            MainViewModel(this.repository) as T
        } else {
            throw IllegalArgumentException("Sample ViewModel Not Found")
        }
    }
}

MainRepository.kt

class MainRepository constructor(private val retrofitService: ApiInterface){
    fun getSampleData() = retrofitService.getSampleData()
}

MainActivity.kt

class MainActivity : AppCompatActivity() {
    private lateinit var pieChart: PieChart

    lateinit var sampleViewModel: MainViewModel

    private val sampleService = ApiClient.getApiSample()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        pieChart = findViewById(R.id.PieChart)

        sampleViewModel= ViewModelProvider(this, MainViewModelFactory(MainRepository(sampleService))).get(MainViewModel::class.java)

        getPieChart(pieChart)

    }

    private fun getPieChart(pieCharts: PieChart) {
        mainViewModel.mainList.observe(this, Observer {
            Log.d("TAG sample" , "onCreate PieChart: $it")
Log.d("Tag Samples Response" , response.body().toString())
                    if (it != null) {
                        val sampleEntries: List<PieEntry> = ArrayList()
                        for ((attributes) in it!!) {
                            sampleEntries.toMutableList()
                                .add(PieEntry(attributes.positive, attributes.region))
    
        //........................................................................
    
                            val description = Description()
                            description.text = "Samples Data"
                            pieChart.description = description
                            pieChart.invalidate()
                        }
                    }
        })
        mainViewModel.errorMessage.observe(this, Observer {  })
        mainViewModel.getSampleData(pieCharts)
    }
}

最后,这是一些或日志消息:

V/InputMethodManager: Starting input: tba=android.view.inputmethod.EditorInfo@8b795c0 nm : com.example.diargram ic=null
D/Tag Sample Response: null
D/TAG Sample: onCreate PieChart: null
E/libc: Access denied finding property "ro.serialno"
V/StudioTransport: Agent command stream started.
V/StudioTransport: Transport agent connected to daemon.

如果有人可以帮助我,我将不胜感激:D,谢谢

【问题讨论】:

  • 你能发一份你的json响应样本吗
  • 由于后台序列化错误,body可能为null。改造所做的是它返回 null 并且没有错误消息
  • @ebs237 这是我的 json [ { "samplesAPI": { "FID": 11, "region": "seoul", "positive": 406205 } }, { "samplesAPI": { "FID": 12, "region": "hoseong", "positive": 277553 } } ]
  • @ebs237 无论如何,我已经收到了回复,但它不会显示在我的饼图中,有什么解决方案吗?
  • 为了正确实施 MVVM 保留一个 livedata 变量来获取响应的值并更新 MAIN 活动中饼图上的数据

标签: android kotlin retrofit2 android-mvvm


【解决方案1】:

最后,我找到了解决问题的方法:

  1. 我在接口类中输入了错误的端点,它应该是这样的:

接口接口接口 { @GET("样本") 有趣的 getSampleData(): 调用 }

  1. 在将实时数据分配给视图时,根据我的 JSON,我应该调用 ArrayList 而不是 List
  2. 列表项

之前:

val sampleEntries: List = ArrayList()

之后:

val sampleEntries: ArrayList<PieEntry> = ArrayList()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多