2

我刚开始学习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();
    }

}
4

1 回答 1

1

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

如果应用程序处于活动状态,这意味着所有单例类都不会被垃圾回收。如果以某种方式使用单例模式,您的 ViewModel 将被丢弃,但UserRepository它的所有成员变量都不会。UserRepository这可能就是您MutableLiveData<UserResult> data立即返回值的原因。

如果你不喜欢这种行为,你可能不应该在UserRepository.

    private MutableLiveData<UserResult> data = new MutableLiveData<>();
于 2019-07-04T15:54:04.113 回答