mvvmandroid中的Api调用

mvvmandroid中的Api调用,android,mvvm,kotlin,android-mvvm,Android,Mvvm,Kotlin,Android Mvvm,我是mvvm新手,我一直在尝试在mvvm中使用改型在kotlin中调用api。 这是我的xml <TextView android:text="TextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/textView" app:layout_constraintStart_toStar

我是mvvm新手,我一直在尝试在mvvm中使用改型在kotlin中调用api。 这是我的xml

<TextView
        android:text="TextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textView" app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginTop="84dp" app:layout_constraintTop_toTopOf="parent"/>
<Button
        android:text="Button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/button" app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintHorizontal_bias="0.498" app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginTop="332dp" app:layout_constraintTop_toBottomOf="@+id/textView"
        android:layout_marginBottom="8dp" app:layout_constraintBottom_toBottomOf="parent"/>

这是我的主要活动。当我在视图中调用api时,模型测试总是空的,应该是10000或其他数字。我认为createCode函数在触发OnResponse或OnFailure之前完成。但我不知道该怎么做,我想使用mvvm。

我想,您的问题是因为您在活动中观察到一个LiveData对象,但当您从api收到结果时,您只需用新的LiveData替换该对象。您应该等待结果并将其写入ViewModel中已创建的LiveData中。使用LiveData是可能的。大概是这样的:

val monthData = MediatorLiveData<MonthData>() /// livedata i subscribed in view
在我的例子中,我在RxJava上进行了回购,并将其转换为如下livedata(用例):

fun getCalendarEvents():LiveData{
val result=mutableLiveDataOf()
AppointsRepository.getAppointmentsIn().subscribe{data->
result.value=数据
}
返回结果
}

希望对你有帮助。无论如何,如果您仍然有问题,请发表评论:)

您是否尝试删除
testViewModel
类中的println(test.value.toString()),因为您的
CreateCode(sendUser).enqueue
是异步调用,它将始终使createCode函数在触发OnResponse或OnFailure之前完成。我认为它不会改变任何东西。它只是在日志中显示结果。@DayyanNiliSani你得到答案了吗?…我也刚刚启动mvvm,面临类似问题。嗨@Sergey,你能解释一下吗?我也面临着同样的问题,在响应中得到空值我,@JahanviKariya,会很酷,如果你分享你的代码,因为你的情况可能会有所不同。但是,如果您确定它是相同的,那么好吧:在TS的例子中,有两个LiveData——一个在开始时在ViewModel中创建,另一个在Repository方法(createCode)中创建。所以,您将在UI中订阅第一个livedata(来自ViewModel),然后从存储库返回另一个livedata。此外,您不能在返回livedata后立即使用它(在TS的情况下,在
createCode
之后的下一行),因为该api调用是异步的,并且数据不会立即出现。
fun createCode(): LiveData<Int> {
    var sendUser = CreateCodeUserClass()
    sendUser.setUsername("09360767928")
    var data = MutableLiveData<Int>()
    my_API_Interface!!.CreateCode(sendUser).enqueue(object : retrofit2.Callback<Void> {
        override fun onFailure(call: Call<Void>, t: Throwable) {
            data.value = 10000
            println(data.value.toString())
        }

        override fun onResponse(call: Call<Void>, response: Response<Void>) {
            data.value = response.code()

        }

    })
    return data
}
class MainActivity : AppCompatActivity() {

    public var viewModel = testViewModel()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        viewModel = ViewModelProviders.of(this).get(testViewModel::class.java)
            viewModel.test!!.observe(this, Observer { data ->
                print(data.toString())
                textView.text = data.toString()
            })

        button.setOnClickListener {
            viewModel.clicked()
        }
    }
}
val monthData = MediatorLiveData<MonthData>() /// livedata i subscribed in view
fun loadMonthEvents() {
    monthData.addSource(useCase.getCalendarEvents()) {
        monthData.value = it
    }
}
fun getCalendarEvents(): LiveData<MonthData?> {
    val result = mutableLiveDataOf<MonthData?>()

    appointmentsRepository.getAppointmentsIn().subscribe { data ->
        result.value = data
    }

    return result
}