应用关闭后,ViewModel 和 LiveData 不会被删除。为什么?
ViewModel and LiveData are not deleted after the application is closed. Why?
我刚开始学习 android 开发,遇到了问题,很高兴得到任何帮助。
当我点击 "User exists?" 按钮时,一个请求被发送到服务器,服务器 returns 要么是一个用户要么是 null(在我的例子中,总是 null,因为没有创建用户服务器)。
在观察者中点击按钮后,日志中显示如下:
UserResult onChanged
用户结果不为空
UserResult 假 null
也就是说,一切正常。
当我按下 "Back" 按钮关闭应用程序时,我在日志中看到为 activity 调用了 onDestroy,为 ViewModel 调用了 onCleared。
但是,如果我什至 运行 一个小时后再次应用程序,则会立即显示日志(无需按按钮):
UserResult onChanged
用户结果不为空
UserResult 假 null
但是如果关闭应用程序后我通过操作系统清理所有 运行ning 应用程序,那么日志中不会显示任何内容。
为什么关闭应用一个小时后ViewModel和LiveData还没有删除?我想我做错了什么,请帮助我理解我的错误是什么。谢谢
ViewModel
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;
}
}
Activity
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();
}
}
没有任何错误。这是预期的行为。 Android OS 通常 不会在用户关闭应用程序时终止应用程序进程。 OS 终止进程的情况很少,但用户关闭应用程序不是其中之一。
如果应用程序处于活动状态,这意味着所有单例 类 都不会被垃圾回收。您的 ViewModels 将被丢弃,但 UserRepository
及其所有成员变量不会,如果 UserRepository
以某种方式使用单例模式。这可能就是为什么你的 MutableLiveData<UserResult> data
returns 立即成为一个值。
如果您不喜欢这种行为,您可能不应该在 UserRepository
.
中保持在底线以下
private MutableLiveData<UserResult> data = new MutableLiveData<>();
我刚开始学习 android 开发,遇到了问题,很高兴得到任何帮助。
当我点击 "User exists?" 按钮时,一个请求被发送到服务器,服务器 returns 要么是一个用户要么是 null(在我的例子中,总是 null,因为没有创建用户服务器)。
在观察者中点击按钮后,日志中显示如下:
UserResult onChanged
用户结果不为空
UserResult 假 null
也就是说,一切正常。
当我按下 "Back" 按钮关闭应用程序时,我在日志中看到为 activity 调用了 onDestroy,为 ViewModel 调用了 onCleared。
但是,如果我什至 运行 一个小时后再次应用程序,则会立即显示日志(无需按按钮):
UserResult onChanged
用户结果不为空
UserResult 假 null
但是如果关闭应用程序后我通过操作系统清理所有 运行ning 应用程序,那么日志中不会显示任何内容。
为什么关闭应用一个小时后ViewModel和LiveData还没有删除?我想我做错了什么,请帮助我理解我的错误是什么。谢谢
ViewModel
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;
}
}
Activity
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();
}
}
没有任何错误。这是预期的行为。 Android OS 通常 不会在用户关闭应用程序时终止应用程序进程。 OS 终止进程的情况很少,但用户关闭应用程序不是其中之一。
如果应用程序处于活动状态,这意味着所有单例 类 都不会被垃圾回收。您的 ViewModels 将被丢弃,但 UserRepository
及其所有成员变量不会,如果 UserRepository
以某种方式使用单例模式。这可能就是为什么你的 MutableLiveData<UserResult> data
returns 立即成为一个值。
如果您不喜欢这种行为,您可能不应该在 UserRepository
.
private MutableLiveData<UserResult> data = new MutableLiveData<>();