Android mvvm+;实时数据,由于以前的实时数据值而重新加载相同的片段
我在一个活动中有两个片段。在单击按钮时,我设置了导致api调用的api json请求体。在api成功响应时,应用程序移动到第二个片段。但当我按下后退按钮时,由于之前的live data success值,fragment 2会重新加载 观察员被设置为监听api响应Android mvvm+;实时数据,由于以前的实时数据值而重新加载相同的片段,android,mvvm,android-livedata,Android,Mvvm,Android Livedata,我在一个活动中有两个片段。在单击按钮时,我设置了导致api调用的api json请求体。在api成功响应时,应用程序移动到第二个片段。但当我按下后退按钮时,由于之前的live data success值,fragment 2会重新加载 观察员被设置为监听api响应 override fun onViewCreated(view: View, savedInstanceState: Bundle?) { binding.lifecycleOwner = viewLifecycleOwner
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
binding.lifecycleOwner = viewLifecycleOwner
super.onViewCreated(view, savedInstanceState)
binding.phoneNumberViewModel = phoneNumberViewModel
pref = getSharedPref()
setToolbar()
setApiObservers()
setClickListeners()
}
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()*/
}
}
}
}
}
})
}
这里触发api从api或文件室加载数据
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响应
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
binding.lifecycleOwner = viewLifecycleOwner
super.onViewCreated(view, savedInstanceState)
binding.phoneNumberViewModel = phoneNumberViewModel
pref = getSharedPref()
setToolbar()
setApiObservers()
setClickListeners()
}
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())
}
}
val userCheckDbTable:LiveData=
switchMap(_fetchCheckUserJSONBody){nonNullCheckUserJSONBody->
if(nonNullCheckUserJSONBody==null){
AbsentLiveData.create()
}否则{
splashScreenRepository.callCheckUser(非NullCheckUserJSonBody.getGson())
}
}
当API调用成功时,必须有一个侦听器才能从Fragment1移动到Fragment2。要么在片段转换后注销侦听器,要么使用单一时间更新方法。发布进一步澄清的代码编辑我的问题。您可以检查什么是“userCheckDbTable”?给出它的数据类型以及在哪里声明?(我想是在视图模型中)是在视图模型中