我在单个活动中有两个片段。单击按钮时,我设置了导致 api 调用的 api json 请求正文。在 api 成功响应应用程序移动到第二个片段。但是当我按下返回按钮时,片段 2 会重新加载,因为之前的实时数据成功值。
观察者被设置为监听 api 响应
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
binding.lifecycleOwner = viewLifecycleOwner
super.onViewCreated(view, savedInstanceState)
binding.phoneNumberViewModel = phoneNumberViewModel
pref = getSharedPref()
setToolbar()
setApiObservers()
setClickListeners()
}
这里触发 api 从 api 或 room 加载数据
override fun onClick(view: View?) {
activity?.let {
if (isAdded) {
when (view?.id) {
R.id.btn_sign_in -> {
checkPhoneNumber(getString(R.string.msisdn_with_code, phoneNumberViewModel.msisdn.get().toString())) // here triggering api
}
}
}
}
}
private fun checkPhoneNumber(phoneNumber: String) {
phoneNumberViewModel.setCheckUserJSONBody(
UserCheckJSONBody(
getDeviceId(),
phoneNumber,
null
)
)
}
private fun setApiObservers() {
setCheckUserApiObserver()
}
这里它监听 api 响应
private fun setCheckUserApiObserver() {
binding.userCheckDbTable = phoneNumberViewModel.userCheckDbTable
phoneNumberViewModel.userCheckDbTable?.observe(
viewLifecycleOwner,
Observer { userCheckResponseResource ->
activity?.let { fragActivity ->
if (isAdded) {
userCheckResponseResource?.let { nonNullUserCheckResponseResource ->
when (nonNullUserCheckResponseResource.status) {
Status.LOADING -> {
}
Status.SUCCESS -> {
pref?.setValue(Constants.PHONE_NUMBER, getString(R.string.msisdn_with_code, phoneNumberViewModel.msisdn.get().toString()))
navigateToLoginPinFragment()
}
Status.MSISDN_NOT_REGISTERED -> {
navigateToCreatePinFragment()
}
Status.INTERNET_CONNECTION_ERROR -> {
Toast.makeText(
fragActivity,
"internet connection error",
Toast.LENGTH_SHORT
).show()
}
Status.INVALID_PARAMETERS -> {
Toast.makeText(
fragActivity,
"invalid pramams",
Toast.LENGTH_SHORT
).show()
}
else -> {
nonNullUserCheckResponseResource.data?.let { repeatNecTransactionResponse3 ->
repeatNecTransactionResponse3.errorMessage?.let { errorMessage ->
Toast.makeText(
fragActivity,
errorMessage,
Toast.LENGTH_SHORT
).show()
} /*?: showMaintenanceErrorDialog()*/
} /*?: showMaintenanceErrorDialog()*/
}
}
}
}
}
})
}
它在视图模型中标定如下:
val userCheckDbTable: LiveData<Resource<UserCheckDBTable>>? =
Transformations.switchMap(_fetchCheckUserJSONBody) { nonNullCheckUserJSONBody ->
if (nonNullCheckUserJSONBody == null) {
AbsentLiveData.create()
} else {
splashScreenRepository.callCheckUser(nonNullCheckUserJSONBody.getGson())
}
}