阅读从JavaFX控制器的URL JSON不更新时,JSON更新
我尝试创建Java程序,从此url读取JSON,该URL包含每20秒更新一次的JSON数组,这里是我的Java程序,从JSON文件打印最后一个JSON对象:阅读从JavaFX控制器的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-*-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()函数在这里https://github.com/kikirizki/mapapp/blob/master/src/main/java/com/delameta/vesselmap/Controller.java线526来更新UI,感谢
我的代码有什么问题,为什么ListenToJson()函数读取过时的JSON文件?
我自己找到了解决方案,问题是mapjfx库(我在代码中使用)使用缓存来缓存地图切片,然后它也会缓存JSON文件。该解决方案是简单地禁用缓存机制,只是魔鬼它的线350,改变
offlineCache.setActive(true);
是
offlineCache.setActive(false);
注意:我是mapjfx lib的作者;当缓存被激活时,**每个** HttpUrlConnection请求都会被缓存。我将创建一个问题来提高某些URL或模式可能被排除在缓存之外。但我不能保证,当我实施这个计划时,我现在很忙。 –
非常感谢你@PJMeisch –
https://www.sothawo.com/2017/06/mapjfx-1-13-0-adds-the-possibility-to-exclude-urls-from-being-cached/ –
在'ListenToJson'类没有更新UI。你可以在每次读取新的JSON时显示更新UI的代码版本吗? –
我已经更新了这个问题,并创建了一个名为ListenToJson的新函数,并将其与controller.java合并。注意:代码实际上并没有更新UI,它只是使用System.out.print()打印JSON,并且结果显示JSON文件已过时 –
为什么不使用计时器 - > [here](https: //*.com/questions/16128423/how-to-update-the-label-box-every-2-seconds-in-java-fx)? – Sedrick