2
votes

Comment définir une valeur lorsque la page se charge sous Android?

Je crée une application Android et je suis bloqué à un moment donné sans savoir quoi faire. J'appelle un webservice et j'obtiens une valeur JSON. Ensuite, j'ai défini cette valeur dans un champ TextView . Mais le problème auquel je suis confronté est que lorsque la page est chargée, il se fait tard pour définir la valeur sur ce TextView . Et parfois, cette valeur n'est pas définie sur ce TextView . Je dois donc vérifier cela avant de passer à une autre fonction et si la valeur n'est pas définie pour appeler à nouveau la méthode suivante.

Appelez le service Web et obtenez la valeur et définissez le texte sur le TextValue

protected void onCreate(Bundle savedInstanceState) {
   //There are more codes,
   getJsonRequest();
}

Ensuite, j'ai appelé cette méthode à l'intérieur de onCreate().

private void getJsonRequest() {
    String tag_string_req = "req_data";

    request = new StringRequest(Request.Method.POST, "URL", new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            try {
                JSONObject jsonObject = new JSONObject(response);
                if (jsonObject.names().get(0).equals("res")) {

                    JSONArray array = jsonObject.getJSONArray("res");
                    JSONObject obj = array.getJSONObject(0);
                    String value = obj.getString("value");

                    spin.setText(value);
                } else {
                    Toast.makeText(getApplicationContext(), "No Value Available", Toast.LENGTH_SHORT).show();
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
        }
    }) {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            hashMap = new HashMap<String, String>();
            hashMap.put("uid", userID);
            return hashMap;
        }
    };
    request.setRetryPolicy(new DefaultRetryPolicy(15 * 1000, 1,
        DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    AppController.getInstance().addToRequestQueue(request, tag_string_req);
}


3 commentaires

Il serait mauvais de maintenir l'interface utilisateur, au lieu d'afficher la barre de progression pour maintenir l'interaction de l'utilisateur.


il y a quelque chose qui s'appelle ASYNC TASK


J'apprécie vraiment si quelqu'un peut donner un extrait de code?


3 Réponses :


3
votes

Vous pouvez créer une boîte de dialogue de progression pour montrer à l'utilisateur que vous récupérez des données

  mHasReceivedData = true;

Ce serait avant d'envoyer la requête

Ensuite, dans onResponse après avoir défini le texte dans le textView, vous appelez cela

  protected void onCreate(Bundle savedInstanceState) {
   //There are more codes,
   getJsonRequest();

   if(mHasReceivedData){
    //here you use the returned data.

Vous devez également fermer la boîte de dialogue de progression dans onErrorResponse

EDIT:

Si vous devez attendre la valeur du JSON renvoyé parce que vous est-ce que cette valeur dans une implémentation ultérieure, vous pouvez définir un booléen marquer ceci

  private boolean mHasReceivedData = false;

Ensuite, dans la méthode onCreate , vous le changez comme ceci

  progressDialog.dismiss();

} }

Et dans le succès de la requête, vous ajoutez cette ligne

  //initialize the progress dialog and show it
  progressDialog = new ProgressDialog(getActivity());
  progressDialog.setMessage("Getting data..");
  progressDialog.show();

De cette façon, vous vous assurez que la valeur du JSON code renvoyé > est défini avant de l'utiliser, il n'y aura donc pas de textView vide.


7 commentaires

Ne puis-je pas faire cela lorsque la page se charge? Lorsque la page se charge complètement, la valeur doit être définie.


Je n'ai pas obtenu ce que vous vouliez réaliser? Pouvez-vous m'expliquer?


Lorsque l'activité se charge, je dois définir cette valeur JSON dans le champ de texte. Comme une valeur par défaut. Pas de temps d'attente. Comment puis je faire ça?


Vous ne pouvez pas faire cela, car le temps d'attente dépend du délai de votre serveur et de la vitesse de connexion Internet. Donc, vous ne pouvez rien faire concernant le temps d'attente, mais si vous avez besoin de la valeur JSON pour d'autres fonctions et que vous ne devez exécuter ces fonctions que lorsque vous obtenez votre valeur JSON , s'il vous plaît dites-le et j'ai une solution pour vous.


Non, car votre requête volley est déjà asynchrone.


Pouvez-vous me suggérer un moyen d'y parvenir?


@HasithaMJayawardana Jetez un œil à ma réponse modifiée s'il vous plaît.



4
votes
private void getJsonRequest() {
String tag_string_req = "req_data";

request = new StringRequest(Request.Method.POST, "URL", new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
      progressDialog.dismiss();
        try {
            JSONObject jsonObject = new JSONObject(response);
            if (jsonObject.names().get(0).equals("res")) {

                JSONArray array = jsonObject.getJSONArray("res");
                JSONObject obj = array.getJSONObject(0);
                String value = obj.getString("value");

                spin.setText(value);
            } else {
                Toast.makeText(getApplicationContext(), "No Value Available", Toast.LENGTH_SHORT).show();
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        progressDialog.dismiss();
        error.printStackTrace();
    }
}) {
    @Override
    protected Map<String, String> getParams() throws AuthFailureError {
        hashMap = new HashMap<String, String>();
        hashMap.put("uid", userID);
        return hashMap;
    }
};
request.setRetryPolicy(new DefaultRetryPolicy(15 * 1000, 1,
    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
progressDialog = new ProgressDialog(context);
progressDialog.setMessage("Fetching The File....");
progressDialog.show();
AppController.getInstance().addToRequestQueue(request, tag_string_req);
}

0 commentaires

0
votes

La solution la plus simple que je suggère est de créer un objet et de synchroniser dessus, cela garantira que la vue de texte est définie avant que votre utilisateur ne voie la page, mais c'est une mauvaise pratique de le faire.


0 commentaires