2017-08-06 46 views
0

我无法弄清楚如何从一个每2-3秒更新一次的json api在android中获得实时更新。我已经设法下载JSON代码,然后创建一些数组并记录它们,但是我每隔2-3秒就会更改json api的值,并且我不知道如何重新下载JSON。在此先感谢您的帮助!Android JSON实时更新

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    DownloadTask task = new DownloadTask(); 

    String result = null; 
    try{ 
     result = task.execute("thelinkIuse").get(); 
    } catch (InterruptedException | ExecutionException e) { 
     e.printStackTrace(); 
    } 

} 


public class DownloadTask extends AsyncTask<String, Void, String>{ 


    @Override 
    protected String doInBackground(String... urls) { 

     String result = ""; 
     URL url; 
     HttpURLConnection urlConnection = null; 


     while (true) { 
      try { 
       url = new URL(urls[0]); 
       urlConnection = (HttpURLConnection) url.openConnection(); 
       InputStream in = urlConnection.getInputStream(); 
       InputStreamReader reader = new InputStreamReader(in); 
       int data = reader.read(); 
       while (data != -1) { 
        char current = (char) data; 
        result += current; 
        data = reader.read(); 
       } 
       return result; 
      } catch (IOException e) { 
       e.printStackTrace(); 
       return "Failed"; 
      } 
     } 
    } 


    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 


     try { 
      JSONArray arr = new JSONArray(result); 

      for (int i = 0; i < arr.length(); i++) { 

       JSONObject jsonPart = arr.getJSONObject(i); 
       symbols.add(jsonPart.getString("symbol")); 
       bids.add(jsonPart.getString("bid")); 
       asks.add(jsonPart.getString("ask")); 


      } 

      Log.i("Symbols", String.valueOf(symbols)); 
      Log.i("Bids", String.valueOf(bids)); 
      Log.i("Asks", String.valueOf(asks)); 


     } catch (JSONException e) { 
      e.printStackTrace(); 
      Log.i("failed", "failed"); 
     } 


    } 



} 
+0

如果您觉得答案可以解决问题,请点击绿色复选标记将其标记为“已接受”。这有助于将注意力集中在仍然没有答案的旧版SO上。 –

回答

1
Timer timer = new Timer(); 
     timer.scheduleAtFixedRate(new TimerTask() { 
      @Override 
      public void run() { 
       try{ 
        result =new DownloadTask().execute("thelinkIuse").get(); 
       } catch (InterruptedException | ExecutionException e) { 
        e.printStackTrace(); 
       } 
      } 
     },0,5000); 

这将调用的AsyncTask每5秒,从而获取更新的JSON字符串

+0

hi @ user3450385“它每5秒记录一次失败” - user3450385 1小时前。只有在考虑使用工厂来获取新实例时,才能执行asyncTask。你也可以解释发生的故障吗? –

0

我想你需要某种轮询机制。查看Firebase通知,因为您可以做的是让您的服务器端代码向Firebase服务器发送http请求,并且会触发服务器端推送通知给您的应用程序,在该应用程序中您将拥有一个触发检索过程的接收器

+0

我开始使用firebase。我正在考虑从Firebase服务器上的mylink中提取JSON。你有什么想法,我该怎么做? –

0

如果有关更新发生每隔2-3秒钟,然后你可以定期调用的AsyncTask执行方法是绝对肯定的。这不是一个很好的做法,但可以完成您的工作。这些行上的内容:

private Timer autoRefresh; 

autoRefresh=new Timer(); 
    autoRefresh.schedule(new TimerTask() { 
     @Override 
     public void run() { 
      runOnUiThread(new Runnable() { 
       public void run() { 
        String result = null; 
        try{ 
        result = task.execute("thelinkIuse").get(); 
        } catch (InterruptedException | ExecutionException e) { 
        e.printStackTrace(); 
} 

       } 
      }); 
     } 
    }, 0, your_time_in_miliseconds);