java - 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());
}
});
解决方案
setText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
requestLatch.await();
您不能调用await
UI 线程。在上述代码中此时调用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());
}
});
推荐阅读
- mod-rewrite - www IIS 重写不尊重本地主机
- python - 使用 Gensim 从 Fasttext 的 .bin 文件重新训练 FastText 模型时出现问题。“FastTextTrainables”对象没有属性“syn1neg”
- java - @Cacheable 注解在迁移到 WebFlux 后不起作用
- sqlite - 如何在颤振中启动应用程序时检查我的 sqlflite 数据库是否有数据?
- sql - SQL比较用空格分隔的值
- c - 在非常特殊的情况下无法重新分配内存
- python - 如何在pyspark数据框中的嵌套json中获取字典值
- javascript - 未保存到数组中的值 - Javascript
- angular - 对用户可见时在 Angular 8 页面上执行代码
- azure - 如何调整 Azure 室内地图的模糊度?