2016-03-04 1 views
0

Je télécharge un fichier JSON volumineux à partir d'une API, puis je l'écris dans un fichier. Pour obtenir le JSON, j'utilise une classe VolleySingleton et ma méthode GET;Volley GET Demande de l'application de blocage

public void sendJSONRequest(){ 
    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, 
      URL, 
      (String) null, 
      new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 
        Toast.makeText(getContext(), response.toString(), Toast.LENGTH_SHORT).show(); 
       } 
      }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 

     } 
    }); 

    mRequestQueue.add(jsonObjectRequest); 

} 

Mais quand je l'appelle sendJSONRequest() sur la méthode OnCreate de mon activité mes gels app et cesser de travailler, vous aurez une option pour fermer l'application ou attendre, je pensais que Volley était asynchrone, que suis-je mal faire?

+0

Si vous chargez probablement le contenu de texte volumineux dans un Toast, l'interface utilisateur sera gelée. La requête est asynchrone. L'onResponse ne l'est pas. –

+0

postez votre code. –

Répondre

2

Oui, les demandes sont asynchrones. ie: Exécuté dans un thread d'arrière-plan. Je pense que la cause est parce que vous avez un grand JSON. Essayez le commentaire suivant et vérifiez si l'application se bloque.

Toast.makeText(getContext(), response.toString(), Toast.LENGTH_SHORT).show(); 

Si l'application ne gèle pas maintenant, c'est parce que la chaîne de réponse est trop grande.

Dans ce cas, vous devez également effectuer le traitement de la réponse dans un AsyncTask. REMARQUE: Vous ne pouvez pas afficher un Toast dans un thread autre que le thread de l'interface utilisateur. Mais supposons que vous essayiez d'analyser le fichier json et que vous l'enregistriez dans une base de données SQLite, vous pouvez le faire dans un AsyncTask.

Si l'application se bloque encore après avoir commenté le LOC ci-dessus, il y a quelque chose qui ne va pas ailleurs.

+1

Ahhh maintenant je me sens stupide, je me connecte habituellement, je ne sais pas pourquoi j'ai mis un toast juste là. Merci mec! –

+0

De rien. –

2

Essayez d'ajouter Timeout et max tente politique demande de volley comme celui-ci

final int CONNTIMEOUT=30000; 

     JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET,urlBuffer.toString(),null, 
          new Response.Listener<JSONObject>(){ 

           @Override 
           public void onResponse(JSONObject response) { 
            Log.i(Constants.NETLOG, "Volley response= " + response.toString()); 
            //Success response 

            if(dialog!=null && dialog.isShowing()) 
            {dialog.dismiss();} 
           } 
          }, new Response.ErrorListener(){ 
         @Override 
         public void onErrorResponse(VolleyError error) { 
          Log.e(Constants.NETLOG, "VolleyError response= " + error.toString()); 
          if(dialog!=null && dialog.isShowing()) 
          {dialog.dismiss();} 
          //Error in response 
         } 
        }); 
     jsonObjReq.setRetryPolicy(new DefaultRetryPolicy(
          CONNTIMEOUT, 
         DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
         DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 
        Volley.newRequestQueue(mContext).add(jsonObjReq); 
ProgressDialog dialog = ProgressDialog.show(mContext, "Please wait", "Processing........."); 


Une fois cela fait, faites votre processus de réponse de succès dans un thread d'arrière-plan, s'il y a des données énormes à venir selon votre question en utilisant AsyncTask pour libérer votre thread UI et empêcher le blocage/plantage. Et plutôt que de créer un message Toast dans onResponse, vérifiez le résultat à l'aide de Log.v("NETLOG", response.toString());