2017-08-05 2 views
3

Je faisais juste des expériences avec Volley pour apprendre l'appel réseau. J'ai trouvé cela plutôt étrange, donc je veux juste savoir pourquoi cela arrive. Le android developer guide avait un exemple similaire pour Volley et j'ai changé un petit peu pour que la réponse soit contenue dans la chaîne responseJSON et je l'utilise pour la mettre dans un textView dans l'activité. Quand je tournerai la textView au sein la fonction onResponse(), le résultat est affiché dans la textview (ligne commentée) mais si je le fais en dehors la fonction comme indiqué ci-dessous la chaîne responseJSON se null (j'ai vérifié par du pain grillé) et donc la textView apparaît vide. Pourquoi cela arrive-t-il? Pourquoi ne pas responseJSON simplement se lier à la réponse, la portée est toujours valide, donc incapable de comprendre pourquoi cela se produit.Impossible de conserver la valeur de réponse Volley pour une utilisation ultérieure, elle devient nulle

package com.example.imnobody.sampleprojectnetwork; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.android.volley.Request; 
import com.android.volley.RequestQueue; 
import com.android.volley.Response; 
import com.android.volley.VolleyError; 
import com.android.volley.toolbox.StringRequest; 
import com.android.volley.toolbox.Volley; 

public class MainActivity extends AppCompatActivity { 

    private String reponseJSON; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


     final TextView mTextView = (TextView) findViewById(R.id.text); 


     RequestQueue queue = Volley.newRequestQueue(this); 
     String url ="https://www.google.com"; 



     StringRequest stringRequest = new StringRequest(Request.Method.GET, url, 
       new Response.Listener<String>() { 
        @Override 
        public void onResponse(String response) { 

         reponseJSON = response; 
         //mTextView.setText(reponseJSON); 


        } 
       }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       Toast.makeText(MainActivity.this, "nothing", Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     queue.add(stringRequest); 

     mTextView.setText(reponseJSON); 

    } 
} 
+0

Avez-vous l'autorisation d'Internet ** ** dans mainfest ..? –

+0

Comme je l'ai dit je n'ai aucun problème quand j'ai mTextView.setText (reponseJSON) dans la méthode onResponse, seulement quand il est à l'extérieur il n'y a pas de résultat et je veux savoir pourquoi –

Répondre

2

Votre méthode onCreatemTextView.setText(reponseJSON); vous configurez juste le texte à la textview, vous ne définissez pas la référence d'objet reponseJSON,

Et votre StringRequest est une requête asynchrone, la réponse viendra peu plus tard, une fois vous avez la réponse que vous allez définir dans reponseJSON objet. Si vous souhaitez afficher la valeur dans la vue texte, vous devez redéfinir la valeur du texte.

+0

Oh okay, donc si je place la réponse dans onResponse(), je suis fondamentalement le réglage après que j'ai reçu la réponse afin qu'il affiche la sortie, mais dans le cas ci-dessus, je suis le réglage avant que je reçois une réponse et donc c'est nul? –

+1

Oui, vous avez raison, ce sera null. –