我刚开始学习android开发,遇到了问题,很高兴得到任何帮助。
当我点击“用户存在?” 按钮,请求被发送到服务器,服务器返回一个用户或 null(在我的例子中,总是 null,因为在服务器上没有创建用户)。
点击观察者中的按钮后,日志中显示如下:
用户结果 onChanged
用户结果非空
用户结果 false null
也就是说,一切正常。
当我通过按“返回”按钮关闭应用程序时,我在日志中看到 onDestroy 被称为活动,而 onCleared 被称为 ViewModel。
但是,如果我什至在一小时后再次运行该应用程序,则会立即显示日志(无需按下按钮):
用户结果 onChanged
用户结果非空
用户结果 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();
}
}