阅读从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文件?

+0

在'ListenToJson'类没有更新UI。你可以在每次读取新的JSON时显示更新UI的代码版本吗? –

+0

我已经更新了这个问题,并创建了一个名为ListenToJson的新函数,并将其与controller.java合并。注意:代码实际上并没有更新UI,它只是使用System.out.print()打印JSON,并且结果显示JSON文件已过时 –

+0

为什么不使用计时器 - > [here](https: //*.com/questions/16128423/how-to-update-the-label-box-every-2-seconds-in-java-fx)? – Sedrick

我自己找到了解决方案,问题是mapjfx库(我在代码中使用)使用缓存来缓存地图切片,然后它也会缓存JSON文件。该解决方案是简单地禁用缓存机制,只是魔鬼它的线350,改变

offlineCache.setActive(true); 

offlineCache.setActive(false); 
+0

注意:我是mapjfx lib的作者;当缓存被激活时,**每个** HttpUrlConnection请求都会被缓存。我将创建一个问题来提高某些URL或模式可能被排除在缓存之外。但我不能保证,当我实施这个计划时,我现在很忙。 –

+0

非常感谢你@PJMeisch –

+0

https://www.sothawo.com/2017/06/mapjfx-1-13-0-adds-the-possibility-to-exclude-urls-from-being-cached/ –