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