从JavaFX控制器上的url读取JSON不会在JSON更新时更新
我尝试创建一个java程序,从中读取JSON,url包含每20秒更新一次的JSON数组。这是我的java程序,它侦听url并打印JSON文件中的最后一个JSON对象: ListenTojson.java从JavaFX控制器上的url读取JSON不会在JSON更新时更新,java,json,multithreading,javafx,openstreetmap,Java,Json,Multithreading,Javafx,Openstreetmap,我尝试创建一个java程序,从中读取JSON,url包含每20秒更新一次的JSON数组。这是我的java程序,它侦听url并打印JSON文件中的最后一个JSON对象: ListenTojson.java package com.company; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.*; import java.net.URL; im
package com.company;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.*;
import java.net.URL;
import java.nio.charset.Charset;
class ListenToJson implements Runnable {
public void run() {
long tenSeconds = 10*1000L;
while(true) {
try {
JSONArray json = readJsonFromUrl("http://frozen-brook-16337.herokuapp.com/history.json");
JSONObject jo=json.getJSONObject(json.length()-1);
System.out.println(jo.get("data"));
Thread.sleep(tenSeconds);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static String readAll(Reader rd) throws IOException {
StringBuilder sb = new StringBuilder();
int cp;
while ((cp = rd.read()) != -1) {
sb.append((char) cp);
}
return sb.toString();
}
public static JSONArray readJsonFromUrl(String url) throws IOException, JSONException {
InputStream is = new URL(url).openStream();
try {
BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
String jsonText = readAll(rd);
JSONArray jsonArray = new JSONArray(jsonText);
return jsonArray;
} finally {
is.close();
}
}
}
Main.java
package com.company;
public class Main {
public static void main(String[] args){
(new Thread(new ListenToJson())).start();
}
}
代码按照我的预期运行。JSON文件包含每10秒更新一次的坐标。我需要创建一个地图应用程序,从JSON中读取坐标,然后将其作为标记显示在地图上,我使用JavaFx库创建地图应用程序,当我添加上面的代码(ListenToJson.java)时,当我使用JavaFx库时,程序的行为不同,它不会读取最新的JSON文件
这是密码
public class Controller{
//some code
(new Thread(new ListenToJson())).start();
//some code
}
Controller.java
我尝试使用ListenToJson()函数更新UI的完整类位于第526行,谢谢
我的代码有什么问题,为什么ListenToJson()函数会读取过时的JSON文件?我自己找到了解决方案,问题是mapjfx库(我在代码中使用)使用缓存来缓存贴图块,然后它也导致缓存JSON文件。解决方案是简单地禁用缓存机制,只需在第350行将其禁用,然后更改
offlineCache.setActive(true);
将来
offlineCache.setActive(false);
ListenToJson
类中的任何内容都不会更新UI。您能否显示每次读取新JSON时更新UI的代码版本?我已经更新了问题,创建了名为ListenToJson的新函数,并将其与controller.java合并。注意:代码实际上还没有更新UI,它只是使用System.out.print()打印JSON,结果显示JSON文件已过期,为什么不使用计时器->?我尝试使用计时器,它会产生相同的结果注:我是mapjfx库的作者;当缓存被激活时,每个HttpUrlConnection请求都会被缓存。我将为增强创建一个问题,即某些URL或模式可能被排除在缓存之外。但我不能保证,当我执行这一点时,我现在很忙。