关闭应用程序后,不会删除ViewModel和LiveData。为什么?

时间:2019-07-04 15:10:24

标签: android mvvm viewmodel android-livedata mutablelivedata

我刚刚开始学习android开发,但是遇到了问题,很高兴获得帮助。

当我单击“用户存在吗?”按钮,请求发送到服务器,服务器返回用户或null(在我的情况下,始终为null,因为在服务器上没有创建用户)。

单击观察器中的按钮后,日志中将显示以下内容:

UserResult onChanged

UserResult NOT NULL

UserResult假null

也就是说,一切正常。

当我通过按下“返回”按钮关闭应用程序时,在日志中看到onDestroy被称为活动,而onCleared被称为ViewModel。

但是,即使我在一小时后再次运行该应用程序,也会立即显示日志(无需按按钮):

UserResult onChanged

UserResult NOT NULL

UserResult假null

但是,如果在关闭应用程序后我通过操作系统清理了所有正在运行的应用程序,那么日志中将不会显示任何内容。

为什么在关闭应用程序一小时后仍未删除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;
    }
}

活动

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();
    }

}

1 个答案:

答案 0 :(得分:0)

没有任何错误。这是预期的行为。当用户关闭应用程序时,Android OS 通常不会终止应用程序进程。在少数情况下,操作系统会杀死进程,但关闭应用程序的用户不是其中一种。

如果应用程序仍在运行,则意味着所有单例类都不会被垃圾回收。如果UserRepository以某种方式使用单例模式,则您的ViewModels将被丢弃,但是UserRepository及其所有成员变量不会被丢弃。这可能就是您的MutableLiveData<UserResult> data立即返回值的原因。

如果您不喜欢此行为,则可能不应该保持在UserRepository中的行下方。

    private MutableLiveData<UserResult> data = new MutableLiveData<>();