【发布时间】:2018-03-16 10:07:33
【问题描述】:
我目前正在重构我的代码以包含 ViewModel 和 android.arch 库提供的 LiveData。我有一个简单的活动,它将更改密码的请求发送到服务器并根据 HTTP 响应代码进行操作。
为此,我创建了为数据扩展 ViewModel 的类和一个用于调用服务器的存储库类。我的 ViewModel 类有一个 MutableLiveData 字段,我使用 .observe(...) 方法从我的活动中订阅该字段。问题是 .observe(...) 中的代码在配置更改(即屏幕旋转)后一直触发,我不知道为什么。
下面是相应的 ViewModel、Repository 和 Activity 类的代码:
更改密码视图模型
public class ChangePasswordViewModel extends ViewModel{
private MutableLiveData<Integer> responseCode;
private PasswordChangeRepository passwordChangeRepository;
public ChangePasswordViewModel() {
responseCode = new MutableLiveData<>();
passwordChangeRepository = new PasswordChangeRepositoryImpl();
}
public MutableLiveData<Integer> responseCodeLiveData() {
return responseCode;
}
public void sendChangePasswordRequest(String newPassword){
passwordChangeRepository.changePassword(newPassword, passChangeCallback());
}
// Callback that fires after server sends a response
private Callback passChangeCallback(){
...
responseCode.postValue(serverResponse)
...
}
密码更改存储库
public class PasswordChangeRepositoryImpl {
public void changePassword(String newPassword, Callback<Void> callback){
//Sending new password to server and processing response in callback
ServerCalls.changePassword(newPassword, callback);
}
}
活动
public class ChangePasswordActivity extends AppCompatActivity{
...
private void init(){
//Getting appropriate view model
passwordViewModel = ViewModelProviders.of(this).get(ChangePasswordViewModel.class);
// Starting to observe LiveData
passwordViewModel.getResponseCode().observe(this, responseCode -> {
Log.info("Server response is " + responseCode);
});
//Sending new password to server
buttonPassChange.setOnClickListener(view ->
passwordViewModel.sendChangePasswordRequest("newPass")
);
}
...
}
问题是我第一次使用 sendChangePasswordRequest(...) 向服务器发送请求后观察活动中的代码
passwordViewModel.getResponseCode().observe(this, responseCode -> {
Log.info("Server response is " + responseCode);
});
每次旋转屏幕后都会触发。为什么会这样?自上次服务器调用以来 MutableLiveData responseCode 的值尚未更新,那么如果实时数据没有更改,为什么 .observe() 会触发?
【问题讨论】:
标签: android android-lifecycle android-livedata