【问题标题】:LiveData doesn't show data initiallyLiveData 最初不显示数据
【发布时间】:2018-12-04 13:52:47
【问题描述】:

我正在从我的服务器获取一些数据并使用 LiveData 观察它。当我的片段最初启动时,它不会在onChanged() 中返回任何内容,并且在切换片段后,它会使用正确的数据触发onChanged()

调试后,我看到我的API调用成功了,我在那里得到了数据,但它最初并没有通过onChanged()返回数据。

存储库:

public class UserRepository {
    private ApiService apiService;
    private static UserRepository repository;
    private MutableLiveData<User> user = new MutableLiveData<>();

    private UserRepository() {
        apiService = RestClient.getClient().create(ApiService.class);
    }

    public synchronized static UserRepository getInstance() {
        if (repository == null) repository = new UserRepository();
        return repository;
    }

    public LiveData<User> getUser() {
        return user;
    }

    public void fetchUser() {
        Call<User> call = apiService.getUser();
        call.enqueue(new Callback<User>() {
            @Override
            public void onResponse(@NonNull Call<User> call, @NonNull Response<User> response) {
                if (response.body() != null) user.postValue(response.body());
            }

            @Override
            public void onFailure(@NonNull Call<User> call, @NonNull Throwable t) {
                user.postValue(null);
                t.printStackTrace();
            }
        });
    }
}

视图模型:

public class UserViewModel extends AndroidViewModel {
    private LiveData<User> user;

    public UserViewModel(@NonNull Application application) {
        super(application);
        user = UserRepository.getInstance().getUser();
    }

    public LiveData<User> getUser() {
        return user;
    }
}

片段:

userViewModel = ViewModelProviders.of(this).get(UserViewModel.class);
userViewModel.getUser.observe(this, user -> {
    //Set data
})

我可以通过在观察我的片段之前调用UserRepository.getInstance().getUser() 来解决这个问题。但这不是 Google 所说的首选方法,而是一种解决方法。

【问题讨论】:

  • 代替postValue(),试试setValue()方法。
  • @JeelVankhede 没用
  • 您可以在片段中分享您的设置吗?
  • @JeelVankhede 我已经编辑了我的片段代码。我打电话给onCreateView()
  • 你在哪里调用片段中的fetchUser() 方法?可能是您在观察数据后调用它,这就是您延迟观察的原因!

标签: java android android-architecture-components android-livedata android-viewmodel


【解决方案1】:

正如 cmets 中已经提到的,您似乎在设置 fetchUser() 中的任何值之前就在存储库上调用了 getUser()。更改 fetchUser() 使其返回 LiveData,然后从视图模型而不是 getUser() 调用该方法:

public LiveData<User> fetchUser() {
    Call<User> call = apiService.getUser();
    call.enqueue(new Callback<User>() {
        @Override
        public void onResponse(@NonNull Call<User> call, @NonNull Response<User> response) {
            if (response.body() != null) user.postValue(response.body());
        }

        @Override
        public void onFailure(@NonNull Call<User> call, @NonNull Throwable t) {
            user.postValue(null);
            t.printStackTrace();
        }
    });

    return user;
 }

然后在视图模型中:

public UserViewModel(@NonNull Application application) {
    super(application);
    user = UserRepository.getInstance().fetchUser();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多