2017-08-06 4 views
0

Je ne peux pas comprendre comment obtenir des mises à jour en direct dans Android à partir d'une API JSON qui se met à jour toutes les 2-3 secondes. J'ai réussi à télécharger le code JSON et ensuite créer des tableaux et les enregistrer, mais je les valeurs de l'API JSON changent toutes les 2-3 secondes et je n'ai aucune idée de comment télécharger le JSON. Merci d'avance pour votre aide!Android JSON Live mises à jour

@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

Si vous pensez qu'une réponse a résolu le problème, veuillez le marquer comme «accepté» en cliquant sur la coche verte. Ceci aide à garder l'accent sur les SO plus anciens qui n'ont toujours pas de réponses. –

Répondre

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); 

Ceci appellera le AsyncTask toutes les 5 secondes, aller chercher ainsi la chaîne JSON

+0

hi @ user3450385 "les journaux ont échoué toutes les 5 secondes" - user3450385 il ya 1 heure. Un asyncTask ne peut être exécuté qu'une fois que vous devriez envisager d'utiliser une fabrique pour obtenir une nouvelle instance. Aussi pouvez-vous expliquer les échecs qui se produisent? –

0

Je pense que vous avez besoin d'un mécanisme d'interrogation. Regardez les notifications Firebase parce que ce que vous pourriez faire, c'est que votre code côté serveur envoie une requête http au serveur Firebase et déclenche une notification push côté serveur vers votre application dans laquelle vous aurez un récepteur qui déclenchera le processus de récupération

+0

J'ai commencé à utiliser Firebase. Je pensais raconter ce JSON de mylink sur le serveur Firebase. Avez-vous une idée sur comment puis-je faire cela? –

0

mise à jour Si vous êtes absolument sûr au sujet des mises à jour toutes les 2-3 secondes, alors vous pouvez périodiquement appeler la méthode d'exécution AsyncTask. Ce n'est pas considéré comme une très bonne pratique, mais peut faire votre travail. Quelque chose sur ces lignes:

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);