Java 安卓:如何使用倒计时闩锁?

Java 安卓:如何使用倒计时闩锁?,java,android,multithreading,api,Java,Android,Multithreading,Api,我有一个从api请求数据并填充数组列表的函数。 然后在文本视图中使用arraylist中的数据。出现的问题是,函数加载数据需要时间,我设置文本视图的代码在填充arraylist之前执行,导致崩溃……我使用倒计时闩锁解决了这个问题,但它不起作用 我很可能用错了 apirequest函数 private void RequestDataFromApi() { DotaAPIEndpoints textApiService= API_Client.getClient().creat

我有一个从api请求数据并填充数组列表的函数。 然后在文本视图中使用arraylist中的数据。出现的问题是,函数加载数据需要时间,我设置文本视图的代码在填充arraylist之前执行,导致崩溃……我使用倒计时闩锁解决了这个问题,但它不起作用 我很可能用错了

apirequest函数

 private void RequestDataFromApi() {

        DotaAPIEndpoints textApiService= API_Client.getClient().create(DotaAPIEndpoints.class);
        Call<List<Heroes>> call2 =textApiService.getHeroes();
        call2.enqueue(new Callback<List<Heroes>>() {
            @Override
            public void onResponse(Call<List<Heroes>> call, Response<List<Heroes>> response) {
                hero_list.clear();
                hero_list.addAll(response.body());

            }

            @Override
            public void onFailure(Call<List<Heroes>> call, Throwable t) {
                Toast.makeText(MainActivity.this, "hero_list call failed!", Toast.LENGTH_SHORT).show();
            }
        });
        requestLatch.countDown();
    }
不能在UI线程上调用
wait
。在上述代码中,此时调用
wait
是告诉UI线程等待-如果UI线程正在等待,它将无法绘制屏幕更新,因此系统将因“活动未响应”错误而崩溃


也许这会有所帮助,这是一种安全地允许单击按钮的方法,并且在数据尚未加载时不会崩溃。(根本不需要
倒计时锁存器


countdownlock
是用什么创建的?英雄有多少?如果是这样,您需要为每个英雄调用一次
countDown()
,因此应该在
onResponse
onFailure
中进行调用,否则计数将永远不会达到零。
onClick
回调中的
await
调用在ui线程上,这意味着您可能会阻塞ui线程,从而导致ANR。在
onResponse
中使用循环器post(到ui线程)查看结果似乎要简单得多。您将需要查看视图。
setText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                try {
                    requestLatch.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                textt.setText(hero_list.get(0).getHeroImg());

            }
        });
setText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                try {
                    requestLatch.await();
        setText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(hero_list.isEmpty()) {
                    Toast.makeText(MainActivity.this, "List not ready", Toast.LENGTH_SHORT).show();
                    return;
                }
                textt.setText(hero_list.get(0).getHeroImg());
            }
        });