Я хочу отправить некоторые данные на сервер и показать их ответ пользователю. Я использую MVVM, поэтому я создал репозиторий, подобный этому:
class Repository {
fun getData(context: Context, word: String): LiveData<String> {
val result = MutableLiveData<String>()
val request = object : StringRequest(
Method.POST,
"https://.......",
Response.Listener {
result.value = it.toString()
},
Response.ErrorListener {
result.value = it.toString()
}) {
@Throws(AuthFailureError::class)
override fun getParams(): MutableMap<String, String> {
val params = HashMap<String, String>()
params["word"] = word
return params
}
}
val queue = Volley.newRequestQueue(context)
queue.add(request)
return result
}
}
, который просто отправляет «слово» на сервер и получает ответ. Мой класс модели представления содержит только mutableLiveData и функцию. это так:
class ViewModel(application: Application) : AndroidViewModel(application) {
var result = MutableLiveData<String>()
fun getData(word: String): LiveData<String> {
val repository = Repository()
result = repository.getData(getApplication(), word) as MutableLiveData<String>
return result
}
}
Я установил наблюдение за результатом в моей основной Деятельности, поэтому это мои коды MainActivity:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val model = ViewModelProviders.of(this).get(ViewModel::class.java)
submit.setOnClickListener {
model.getData(search_txt.text.toString())
}
model.result.observe(this, Observer {
Log.i("Log", "observe is :$it")
text.text = it
})
}
, но это не работает! Я получаю пользовательский ввод, используя текст редактирования, и после нажатия кнопки я вызываю функцию getData, которая находится в моем классе View Model. но он всегда возвращает ноль, и наблюдение не сработает.
Я пытаюсь поместить метод наблюдений в моем приемнике кнопок, таким образом я получаю результат, но кажется, что это не правильный путь, потому что после того, как я поверну свой телефон, все данные исчезли, и мне нужно снова получить данные с сервера, хотя это не должно быть.