从JavaFX控制器上的url读取JSON不会在JSON更新时更新

从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

我尝试创建一个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;
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或模式可能被排除在缓存之外。但我不能保证,当我执行这一点时,我现在很忙。