当前位置: 首页 > 知识库问答 >
问题:

Android侦听所有布尔[]元素是否为true

魏臻
2023-03-14

一旦boolean[3]中的所有元素都为真,我想隐藏进展栏。为此,我使用MutableLiveData。现在进展栏立即消失,似乎无需等待所有true。这是我的代码。

左抽屉指针:

                if (drawerItemList.get(pos).getTitle().equals(activity.getResources().getString(R.string.statistics_drawer))) {
                Dialog dialog = new MyDialog(activity, R.layout.statistics);
                ProgressBar progressBar = dialog.findViewById(R.id.bigProgressBar);

                MutableLiveData<boolean[]> listen = new MutableLiveData<>();
                listen.setValue(new boolean[]{false, false, false});
                restModel.getAllUsers(listen.getValue(), dialog.findViewById(R.id.usersRegisteredValue));
                restModel.getUsersOnline(listen.getValue(), dialog.findViewById(R.id.usersOnlineValue));
                restModel.getMaxNumberOfUsersOnline(listen.getValue(), dialog.findViewById(R.id.maxNumberOnlineValue));

                listen.observe((LifecycleOwner)activity, new Observer<boolean[]>() {
                    @Override
                    public void onChanged(boolean[] booleans) {
                        if (Stream.of(booleans).allMatch(val -> true))
                            progressBar.setVisibility(View.GONE);
                    }
                });

                dialog.show();
            }

RestModel:

    public void getAllUsers(final boolean isThreeStatisticsCallSucceeded[], TextView textView) {
    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;
            }
        }

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

public void getUsersOnline(boolean isThreeStatisticsCallSucceeded[], TextView textView) {
    Call<String> result = Api.getClient1Or2().getUsersOnline();
    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[1] = true;
            }
        }

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


public void getMaxNumberOfUsersOnline(boolean isThreeStatisticsCallSucceeded[], TextView textView) {
    Call<String> result = Api.getClient1Or2().getMaxUsersOnline();
    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[2] = true;
            }
        }

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

怎么解决?

共有1个答案

庄阿苏
2023-03-14

这里有两个问题。首先,您无法轻松地将布尔[]转换为流

其他直接方法也不起作用:rrays.stream(布尔值)会给你一个编译器错误,rrays.as列表(布尔值)也会给你一个流

您可以从这个答案中遵循以下方法。您基本上将IntStream转换为Stream

第二个问题是如何检查所有元素是否为true。目前您有... allMatch(val-

最后,您的方法应该如下所示:

@Override
    public void onChanged(boolean[] booleans) {
        Stream<Boolean> stream = IntStream.range(0, booleans.length).mapToObj(idx -> booleans[idx]);
        if (stream.allMatch(val -> val))
            progressBar.setVisibility(View.GONE);
        }

 类似资料:
  • 问题内容: 我有一个按钮,并添加了一些按钮: 我可以通过以下方式删除它们: 如果我想一次删除所有侦听器,或者没有函数引用()怎么办?有没有办法做到这一点,或者我必须一个一个地删除它们? 问题答案: 我认为最快的方法是克隆节点,这将删除所有事件侦听器: 请注意,因为这也会清除所涉及节点的所有子元素上的事件侦听器,因此,如果要保留该侦听器,则必须一次显式删除一个侦听器。

  • 检查给定的参数是否是一个原生的布尔值。 使用 typeof 来检查一个值是否为一个布尔值。 const isBoolean = val => typeof val === 'boolean'; isBoolean(null); // false isBoolean(false); // true

  • 背景:问题是什么 我的应用程序有一个单词的首字母缩略词让我们假设它是 字母表 当我使用谷歌的语音服务时,它会读出字母,这很棒。 然而,当我使用三星语音(S Voice)时,它读出的是一个词,这不是很好! 那么为什么不只是设置内容描述呢? ABC出现在许多地方,设置替代内容描述是不可行的。此外,它还可以破解其他语音服务的内容描述,如谷歌的内容描述 我的计划 所以我不久前遇到了一个问题,我发现了这个扩

  • 问题内容: 本质上,我希望更改内容时执行脚本。由于脚本是分开的(Chrome扩展程序和网页脚本中的内容脚本),因此我需要一种方法来简单地观察DOM状态的变化。我可以设置轮询,但这似乎草率。 问题答案: 长期以来,DOM3突变事件是最佳的可用解决方案,但由于性能原因,不建议使用它们。DOM4突变观察者代替了不推荐使用的DOM3突变事件。目前,它们在现代浏览器中的实现方式为(或在旧版Chrome中由供

  • 问题内容: 由于所有元素均为“ false”,如何返回“ false”? 给定的列表是: 问题答案: 使用: 如果可迭代项中有任何真值,则将返回True。

  • 问题内容: 我有两个Activity类。和。稍后,我添加了当用户摇动设备在或时启动的功能。现在,如果我在和中注册了ShakeListener ,就可以实现我的目标 但是,我现在想要的是另一回事,我不想更改和。我想编写一个不同的类,该类在整个应用程序中运行,并为该应用程序中的所有活动注册ShakeListener。我怎样才能做到这一点?那应该是什么样的课? 我尝试了扩展BroadcastReceiv