У меня есть фрагмент в моей деятельности, он получает некоторые данные на своем onActivityResult()
, и пытается обновить пользовательский интерфейс. Это мой onActivityResult()
код:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when (requestCode) {
GET_USER_AUDIO_TO_TEXT_REQUEST_CODE -> {
if (resultCode == RESULT_OK) {
data?.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS)?.let {
val receivedCityName = it[0]
binding.homeCityNameEditTextView.setText(receivedCityName)//Update UI at this line
viewModel.fetchWeatherCity(receivedCityName)
}
} else {
Toast.makeText(activity, R.string.error_while_getting_data_from_recognizer, Toast.LENGTH_SHORT).show()
}
}
}
}
Итак, я попытался создать тест для КИП с эспрессо для этой части, как показано ниже:
@Test
fun checkActionsAfterReceivingDataInOnActivityResult() {
val intent = Intent()
intent.putStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS, arrayListOf(DEFAULT_CITY_NAME))
activityRule.activity.supportFragmentManager
.findFragmentByTag(HomeFragment.CLASS_NAME)
?.onActivityResult(
HomeFragment.GET_USER_AUDIO_TO_TEXT_REQUEST_CODE,
Activity.RESULT_OK,
intent
)
}
Но я получу ошибку после того, как Запуск этого Test method
, который говорит: Эта ошибка из-за моих ViewModel
методов, которые будут работать. вызывая эту строку в onActivityResult ():
viewModel.fetchWeatherCity(receivedCityName)
Это ее ошибка:
java.lang.IllegalStateException: Cannot invoke setValue on a background thread
at android.arch.lifecycle.LiveData.assertMainThread(LiveData.java:435)
at android.arch.lifecycle.LiveData.setValue(LiveData.java:279)
И из-за обновления моего пользовательского интерфейса этой строкой:
binding.homeCityNameEditTextView.setText(receivedCityName)//Update UI at this line
Я тоже получу эту ошибку:
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.