我使用scheduledexecutorservice每15秒从网站获取一次数据:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
scheduler.scheduleAtFixedRate(this::refresh, 0, 15, TimeUnit.SECONDS);
这是每15秒调用一次的方法:
public void refresh() {
Site.refreshData();
System.out.println("Refreshed Data");
LinearLayout listView = findViewById(R.id.linearLayout);
System.out.println("Size: " + List.getList().size());
for (int i = 0; i < List.getList().size(); i++) {
Entry entry = List.getList().get(i);
CardView cardView = (CardView) LayoutInflater.from(
getApplicationContext()).inflate(R.layout.card, listView, false);
ImageView checkedView = (ImageView) cardView.getChildAt(0);
checkedView.setImageDrawable(ContextCompat.getDrawable(getApplicationContext(),
entry.isChecked() ? R.drawable.check : R.drawable.cross));
TextView name = (TextView) cardView.getChildAt(1);
name.setText(entry.getName());
TextView comment = (TextView) cardView.getChildAt(2);
comment.setText(entry.getComment());
listView.addView(cardView, i);
}
System.out.println("Added Cardviews");
listView.invalidate();
System.out.println("Refreshed LinearLayout");
}
我添加了多个打印,作为一个穷人的调试器,我只到了打印arraylist大小的地步。从那以后什么都没有印出来,就好像行刑停止了。我确信错误发生在for循环中。我添加了一个打印,显示当前 i
虽然列表大小是57,但它只停留在4。
有什么问题吗?
2条答案
按热度按时间5kgi1eie1#
经过更多的搜索,我找到了一个方法,它完全符合我的要求:
runonuithread(可运行-可运行)
ax6ht2ek2#
在构建gui之前,请在控制台上执行计划的页面检索。
下面是一个示例应用程序。每五秒钟半分钟我们下载一个页面并将其各个部分转储到控制台。
此演示使用
HttpClient
根据jep 321:http客户机添加到java11的类。这里显示的网页访问代码是从本文复制的。提示:一定要优雅地关闭executor服务,因为它的线程池可能会无限期地继续运行,即使在你的应用程序结束之后。
运行时: