首页 > 解决方案 > Android:如何使用 CountDownLatch?

问题描述

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

api请求函数

 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();
    }
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());

            }
        });

标签: javaandroidmultithreadingapi

解决方案


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

                try {
                    requestLatch.await();

您不能调用awaitUI 线程。在上述代码中此时调用await是告诉 UI 线程等待 - 如果 UI 线程正在等待,它无法绘制屏幕更新,因此系统将因 Activity Not Responding 错误而崩溃。


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

        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());
            }
        });

推荐阅读