2017-08-06 61 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);