2016-12-04 1 views
0

J'essaie de remplir la vue recycleur par la liste des transactions que je reçois du serveur. mais à moins que je mette un Thread.sleep(7000), il ne peuplera pas. Cela prend-il autant de temps pour obtenir des données du côté serveur? Si oui, y a-t-il une alternative plus rapide?Obtention des données du serveur trop lent? (Android)

ou est l'obtention de la chaîne de réponse json et l'ajout d'objet à la liste prend du temps? parce que ce sommeil fonctionne juste pour ajouter 5 lignes dans la liste. quand j'essaye d'exécuter la boucle pour le nombre entier de rangs je n'obtiens aucune donnée. Mes hôtes sont PythonAnywhere. réponse est en JSON Api et a environ 400 dossiers:

http://sairav.pythonanywhere.com/getTransaction

Utilisation:

Android Asynchronous Http client ::: compilation « com.loopj.android:android-async-http : 1.4.9'

public List<Transaction> getTransactions(final boolean getAll) { 
     Thread bgThread =null; 

     final List<Transaction> trList=new ArrayList<>(); 
     RequestParams requestParams = new RequestParams(); 

     requestParams.put("uid", Profile.getCurrentProfile().getId()); 

     PAAPI.post("/getTransaction", requestParams, new JsonHttpResponseHandler() { 

@Override 
      public void onSuccess(int statusCode, Header[] headers, JSONArray jsonArray) { 

       Transaction trr = null; 
       if (getAll) { 


        for (int i = 0; i < 5; i++) { 

         try { 
          //String a = jsonArray.getString(i); 
          JSONObject jsonObject = jsonArray.getJSONObject(i); 
          //JSONArray arrayWithElements = jsonObject.toJSONArray(new JSONArray(new String[]{"name","desc","amount","ttype","uid","ttime"})); 

          trr = new Transaction(context); 

          trr.uname = jsonObject.getString("uname"); 
          trr.desc = jsonObject.getString("description"); 
          trr.amount = jsonObject.getString("amount"); 
          trr.type = jsonObject.getString("type"); 
          trr.uid = jsonObject.getString("uid"); 
          trr.date = jsonObject.getString("ttime"); 

          trList.add(trr); 
          // Toast.makeText(context,"size is bro :"+trList.size(),Toast.LENGTH_SHORT).show(); 
          if (i == 1) { 
        //    Toast.makeText(context, trr.uname + "-" + desc + "-" + trr.amount + "-" + trr.type + "-" + trr.uid + "-" + trr.date, Toast.LENGTH_SHORT).show(); 
          } 
         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 

        } 

        // Do something with the response 

       } 
}); 
     try { 
      Toast.makeText(context,"sleeping bo",Toast.LENGTH_SHORT).show(); 

      Thread.sleep(7000); 

     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

     // Toast.makeText(context, "listsize final is" + trList.size(), Toast.LENGTH_SHORT).show(); 
     return trList; 
    } 



class PAAPI { 
    protected static final String BASE_URL = "http://sairav.pythonanywhere.com"; 

    private static AsyncHttpClient client = new AsyncHttpClient(); 

    public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) { 
     client.post(getAbsoluteUrl(url), params, responseHandler); 
    } 

    public static void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) { 
     client.post(getAbsoluteUrl(url), params, responseHandler); 
    } 

    private static String getAbsoluteUrl(String relativeUrl) { 
     return BASE_URL + relativeUrl; 
    } 
} 
+0

premières choses d'abord. Êtes-vous sûr que votre application obtient les données JSON du serveur? – user1506104

+0

oui, c'est pourquoi j'ai été capable d'obtenir des données après le sommeil, non? – user3820753

+0

puis il répond à votre première question: Est-ce que cela prend autant de temps pour obtenir des données du côté serveur? – user1506104

Répondre

0

Utilisez la bibliothèque de rattrapage disponibles pour récupérer ou afficher le d ata à partir d'une url JSON ... il est très facile à utiliser et est efficace

+0

effectivement utilisé maintenant AsyncTask au lieu d'API loopj, et il semble fonctionner très bien. Sans délais. Je vais essayer de rénover aussi. Merci . – user3820753

0

Si vous êtes certain que getString() opération prend trop de temps pour effectuer, vous pouvez utiliser les progrès de dialogue au lieu d'utiliser Thread.sleep()

private class PAAPI extends AsyncTask<Boolean, Void, List<Transaction> { 

    ProgressDialog dialog = new ProgressDialog(MainActivity.this); 

    @Override 
    protected void onPreExecute() { 
     //set message of the dialog 
     dialog.setMessage("Loading..."); 
     //show dialog 
     dialog.show(); 
     super.onPreExecute(); 
    } 

    protected Void doInBackground(Boolean... args) { 
     // do background work here 
     return null; 
    } 

    protected void onPostExecute(List<Transaction> result) { 
    // do UI work here 
    if(dialog != null && dialog.isShowing()){ 
     dialog.dismiss() 
    } 
    } 
} 

et plus tard l'utiliser comme new PAAPI().execute(getAll);

+0

merci Shubham, il s'avère que la bibliothèque loopj était la cause, j'ai utilisé AsyncTask à la place, fonctionne bien maintenant. – user3820753

+0

Bon d'entendre ça !! :) – Shubham