【发布时间】:2019-11-15 08:36:33
【问题描述】:
我刚开始学习 android 开发,遇到了问题,很高兴得到任何帮助。
当我点击“用户存在?”按钮,向服务器发送请求,服务器返回用户或 null(在我的情况下,始终为 null,因为服务器上没有创建用户)。
点击观察者中的按钮后,日志中显示如下:
用户结果 onChanged
用户结果不为空
UserResult false null
也就是说,一切都很完美。
当我通过按“返回”按钮关闭应用程序时,我在日志中看到 onDestroy 被称为活动,而 onCleared 被称为 ViewModel。
但如果我在一小时后再次运行该应用程序,则会立即显示日志(无需按下按钮):
用户结果 onChanged
用户结果不为空
UserResult false null
但是如果关闭应用程序后我通过操作系统清理所有正在运行的应用程序,那么日志中不会显示任何内容。
为什么在应用程序关闭一小时后 ViewModel 和 LiveData 仍未删除?我想我做错了什么,请帮助我理解我的错误是什么。谢谢。
视图模型
class UserViewModel extends ViewModel {
private MutableLiveData<UserResult> userResult;
private UserRepository userRepository;
LiveData<UserResult> getUserResult() {
return userResult;
}
UserViewModel(UserRepository userRepository) {
this.userRepository = userRepository;
userResult = userRepository.getUser(null);
}
void getUser(String username) {
userResult = userRepository.getUser(username);
}
@Override
protected void onCleared() {
Log.d(TAG, "onCleared");
super.onCleared();
}
}
存储库
public class UserRepository {
...
private WebServiceApi webServiceApi;
private MutableLiveData<UserResult> data = new MutableLiveData<>();
public MutableLiveData<UserResult> getUser(String username) {
if (username != null) {
webServiceApi.getUser(username).enqueue(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
User user = response.body();
if (user == null) {
// first param = user, second param = userExistsFlag(true when user not null, false when user is null)
data.setValue(new UserResult(null, false));
} else {
data.setValue(new UserResult(user, true));
}
}
@Override
public void onFailure(Call<User> call, Throwable t) {
Log.d("UserRepository", "onFailure " + t.getMessage());
}
});
}
return data;
}
}
活动
public class UserActivity extends AppCompatActivity {
...
private UserViewModel userViewModel;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user);
...
userViewModel.getUserResult().observe(this, new Observer<UserResult>() {
@Override
public void onChanged(@Nullable UserResult userResult) {
Log.d(TAG, "UserResult onChanged");
if (userResult == null) {
return;
} else {
Log.d(TAG, "UserResult NOT NULL");
Log.d(TAG, "UserResult " + userResult.getUserExistsFlag() + " " + userResult.getUser());
}
}
});
}
@Override
protected void onDestroy() {
Log.d(TAG, "onDestroy");
super.onDestroy();
}
}
【问题讨论】:
-
你为什么希望它们为空?
-
@Blackbelt 我不太明白你的意思
标签: android mvvm viewmodel android-livedata mutablelivedata