You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android监听boolean数组全为true时隐藏ProgressBar的异常问题求助

问题原因

你现在遇到的问题由两个核心错误导致:

  • 判断逻辑完全错误:Stream.of(booleans).allMatch(val -> true) 写法中,lambda固定返回true,相当于无论数组元素实际值是什么,判断结果永远为真,所以LiveData第一次触发回调就直接隐藏了进度条。
  • LiveData未收到更新通知:boolean数组是引用类型,你直接修改数组内部元素的值,LiveData感知不到数据变化,不会触发onChanged回调,即使后续所有接口请求完成,也不会触发状态判断逻辑。

解决方案

按以下步骤修改代码即可:

1. 修正进度条隐藏的判断逻辑

修改LeftDrawerAdapter中LiveData的观察者代码,如果你项目的minSdk≥24可以用Stream的正确写法,否则用for循环兼容更低版本:

listen.observe((LifecycleOwner)activity, new Observer<boolean[]>() {
    @Override
    public void onChanged(boolean[] booleans) {
        // 低版本兼容写法,minSdk≥24可替换为:boolean allFinished = Stream.of(booleans).allMatch(Boolean::booleanValue);
        boolean allFinished = true;
        for (boolean b : booleans) {
            if (!b) {
                allFinished = false;
                break;
            }
        }
        if (allFinished) {
            progressBar.setVisibility(View.GONE);
        }
    }
});

2. 修改RestModel的接口请求方法,新增LiveData参数用于通知状态更新

三个接口方法都做类似修改,每次更新数组状态后主动调用LiveData的setValue方法触发回调:

// 以getAllUsers为例,剩余两个方法getUsersOnline、getMaxNumberOfUsersOnline做相同修改
public void getAllUsers(final boolean isThreeStatisticsCallSucceeded[], TextView textView, MutableLiveData<boolean[]> listen) {
    Call<String> result = Api.getClient1Or2().getAllUsers();
    result.enqueue(new Callback<String>() {
        @Override
        public void onResponse(@NonNull Call<String> call, @NonNull Response<String> response) {
            if(response.body() != null) {
                textView.setText(response.body());
                isThreeStatisticsCallSucceeded[0] = true;
                // 通知LiveData数据已修改
                listen.setValue(isThreeStatisticsCallSucceeded);
            }
        }

        @Override
        public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
            Log.e("getAllUsers failure", t.toString());
            call.clone().enqueue(this);
        }
    });
}

3. 调整接口调用逻辑,传入LiveData实例

修改LeftDrawerAdapter中三个接口的调用代码:

boolean[] statusArr = new boolean[]{false, false, false};
listen.setValue(statusArr);
// 新增listen参数传入
restModel.getAllUsers(statusArr, dialog.findViewById(R.id.usersRegisteredValue), listen);
restModel.getUsersOnline(statusArr, dialog.findViewById(R.id.usersOnlineValue), listen);
restModel.getMaxNumberOfUsersOnline(statusArr, dialog.findViewById(R.id.maxNumberOnlineValue), listen);

内容的提问来源于stack exchange,提问作者user21597761

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 02:27:05