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
相关产品推荐
相关产品推荐

