应用关闭后,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<>();