2016-01-03 1 views
2

Mon application se bloque parce que les images ArrayList sont vides lorsque je définis l'adaptateur, je me suis rendu compte en mettant un message toast juste après avoir analysé ma demande JSON, et un message Toast après avoir initialisé mon adaptateur. deuxième "est imprimé d'abord à l'écran et l'application se bloque juste après, at-il à faire avec mon internet? Ou suis-je raté quelque chose, voici mon code, merci!Volley demande trop lente

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_page); 
    mViewPager = (ViewPager) findViewById(R.id.view_pager); 

    mVolleySingleton = VolleySingleton.getInstance(); 
    mRequestQueue = mVolleySingleton.getRequestQueue(); 

    //First Toast message inside this method 
    sendAPIRequest(); 

    //after you get the images 
    mCustomSwipeAdapter = new CustomSwipeAdapter(this, images); 

    //SECOND TOAST 
    Toast.makeText(getApplicationContext(), "Second", Toast.LENGTH_LONG).show(); 
    mViewPager.setAdapter(mCustomSwipeAdapter); 

    mCustomSwipeAdapter.notifyDataSetChanged(); 

} 

public void sendAPIRequest(){ 
    String requestURL = ""; 
    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, requestURL, (String) null, new Response.Listener<JSONObject>() { 
     @Override 
     public void onResponse(JSONObject response) { 
      parseJSONResponse(response); 

      //FIRST TOAST : SHOULD BE CALLED FIRST 
      Toast.makeText(getApplicationContext(), "First", Toast.LENGTH_LONG).show(); 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 

     } 
    }); 

    mRequestQueue.add(jsonObjectRequest); 
} 

public void parseJSONResponse(JSONObject response) { 
    if (response != null || response.length() != 0) { 
     try { 
      JSONObject GObject = response.getJSONObject("game"); 
      String name = "N/A"; 
      if (GObject.has("name") && !GObject.isNull("name")) { name = GObject.getString("name"); } 

      if (GObject.has("screenshots") && !GObject.isNull("screenshots")) { 
       JSONArray screenShotsArray = GObject.getJSONArray("screenshots"); 
       for (int i = 0; i < screenShotsArray.length(); i++){ 
        JSONObject screenshot = screenShotsArray.getJSONObject(i); 
        String screenshotURL = screenshot.getString("url"); 

        images.add(screenshotURL); 
       } 
      } 


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

Répondre

3

-t-il à voir avec mon internet? Ou suis-je manque quelque chose ...

Les deux. Cela arrive parce que vous avez une condition de concurrence. D'après ce que je peux comprendre, votre liste images est remplie de manière asynchrone par le rappel onResponse. Fondamentalement, cela se produit lorsque votre application reçoit les réponses aux demandes d'API qu'elle effectue. Cela va prendre au moins millisecondes, et éventuellement secondes (ou plus).

Mais votre application est (comme vous le dites) plante rapidement après l'enregistrement de l'adaptateur de balayage, et la preuve est que la liste images n'a pas été remplie.

Il y a trois possibilités:

  • Il y a quelque chose de mal avec les demandes que vous envoyez qui est à l'origine des demandes de l'API pour ne pas vous donner une réponse. (Hypothétiquement, vous pourriez avoir une mauvaise authentification ou quelque chose.)

  • Les demandes d'API prennent beaucoup de temps à cause de la vitesse de la connexion Internet, de l'encombrement ou du ralentissement du serveur distant.

  • Les demandes d'API prennent du temps ... mais l'enregistrement de l'adaptateur est encore plus rapide.

Si (de manière hypothétique) il y a un problème avec vos demandes, vous devrez corriger cela. Mais les deux autres scénarios doivent être fixés par:

  • modification du code qui utilise les images pour fonctionner correctement s'il n'y a aucune image (encore), ou

  • modifier le code d'attendre le chargement de l'image est terminé avant d'enregistrer l'adaptateur.

+0

Merci, il s'avère que mon Internet est correct, j'ai réglé l'adaptateur sur mon ViewPager après avoir chargé avec succès et j'étais sûr à 100% que le onResponse renvoie ce que je voulais, dans ce cas JSON. Donc, le code où j'ai défini mon adaptateur et notifier les données a été modifié; Je l'ai déplacé juste après que j'ai fini d'analyser ainsi dans mon parseJSONResponse, méthode, merci! –

0

S'il vous plaît utiliser ce code dans votre rappel onResponse:

//after you get the images 
mCustomSwipeAdapter = new CustomSwipeAdapter(this, images); 

//SECOND TOAST 
Toast.makeText(getApplicationContext(), "Second", Toast.LENGTH_LONG).show(); 
mViewPager.setAdapter(mCustomSwipeAdapter); 

mCustomSwipeAdapter.notifyDataSetChanged(); 

Volley ajoute vos demandes en file d'attente, afin de mieux faire toutes les tâches dépendantes en réponse ou rappel d'erreur uniquement.