Autore Topic: Ritorno da un metodo Async  (Letto 821 volte)

Offline felasandroid

  • Utente normale
  • ***
  • Post: 345
  • Respect: +10
    • Github
    • balduzziantonio
    • balduzziantonio.unifi
    • Mostra profilo
  • Dispositivo Android:
    Huawei P8 Lite
  • Play Store ID:
    FelasTech
  • Sistema operativo:
    Windows 10
Ritorno da un metodo Async
« il: 04 Novembre 2013, 15:34:03 CET »
0
Nella mia classe login, sto facendo dei test, eseguendo più chiamate tra get e post solo che dopo il primo get mi ritorna il risultato e finisce li senza poi eseguirmi il post successivo..dove sto sbagliado? ecco il codice:


Codice (Java): [Seleziona]
AsyncHttpClient client = new AsyncHttpClient();
                        RequestParams p = new RequestParams();
                        p.put("user", mUsername);

    client.get("http://api.frapi/getusertype.json", p,
                                        new JsonHttpResponseHandler() {

                                                @Override
                                                public void onSuccess(JSONObject response) {
                                                        showProgress(false);

                                                        try {

                                                                JSONObject jsonObject = response.getJSONObject("content");
                                                                category = jsonObject.getString("categoria");                                                  
                       
                                                        } catch (JSONException e) {
                                                                // TODO Auto-generated catch block
                                                                e.printStackTrace();
                                                        }

                                                        return;

                                                }

                                                @Override
                                                public void onStart() {
                                                        showProgress(true);
                                                }
                                        });

                        if (category == "Studente") {

                                url = "https://indirizzo";
                                TextView t1;
                                t1 = (TextView) findViewById(R.id.textView1);
                                t1.setText(category);

                        }

                        else {

                                url = "";
                        }
                       
                       
                        RequestParams params = new RequestParams();
                        TextView t1;
                        t1 = (TextView) findViewById(R.id.textView1);
                        t1.setText(category);

       
                        params.put("Matricola", mUsername);
                        params.put("Password", mPassword);
                        params.put("action", "login");
                        params.put("btnLogin", "entra");

                        client.post(url, params, new AsyncHttpResponseHandler() {
                                @Override
                                public void onSuccess(String response) {
                                        showProgress(false);
                                        TextView t1;
                                        t1 = (TextView) findViewById(R.id.textView1);
                                    t1.setText(response);
                                        //t1.setText(category);

                                }

                                @Override
                                public void onStart() {
                                        showProgress(true);
                                }
                        });

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Ritorno da un metodo Async
« Risposta #1 il: 04 Novembre 2013, 15:48:51 CET »
0
Nella programmazione multi-thread con callback non puoi eseguire le operazioni come se tutto avvenisse linearmente (un evento dopo l'altro).

Nel codice che hai postato tu fai la prima client.get, ed imposti giustamente la callback in modo che ottenga il parametro category. Poi però, dopo la client.get vai a testare category come se questo fosse già arrivato, ma così non è.

Quando esegui la client.get, un thread parallelo viene lanciato per eseguire la get vera e propria, dopo di che l'esecuzione passa subito alla riga successiva ( if (category == "Studente") ) senza attendere che la get sia finita, quindi quasi certamente non farà quello che vorresti facesse.

La parte di codice  if (category == "Studente") devi metterla all'interno della onSuccess, perchè deve essere eseguita subito dopo che ha fatto category = jsonObject.getString("categoria"); .

La chiave della programmazione multi-thread sta nel ricordare che tutte le volte che si lancia un thread, questo diventa autonomo nell'esecuzione ed anche il thread da cui lo hai creato prosegue in parallelo. Ci sono ovviamente metodi per risincronizzare e riallineare i thread, ma è abbastanza inutile parlarne qua. Ti consiglio però di programmare una lettura del capitolo Thread in un qualsiasi manuale Java, diverse aspetti della programmazione di app android diventeranno ovvi.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline felasandroid

  • Utente normale
  • ***
  • Post: 345
  • Respect: +10
    • Github
    • balduzziantonio
    • balduzziantonio.unifi
    • Mostra profilo
  • Dispositivo Android:
    Huawei P8 Lite
  • Play Store ID:
    FelasTech
  • Sistema operativo:
    Windows 10
Re:Ritorno da un metodo Async
« Risposta #2 il: 04 Novembre 2013, 15:55:23 CET »
0
ho provato ad esempio a mettere:

Codice (Java): [Seleziona]
        findViewById(R.id.sign_in_button).setOnClickListener(
                                new View.OnClickListener() {
                                        @Override
                                        public void onClick(View view) {
                                                checkuser();
                                                attemptLogin();
                                        }

                                       
                                });

dove checkuser mi fa il primo get e mi fa il controllo su category come consigliato da te, però io appunto ho messo showProgress(false); che nn mi fa vedere piùla clessidra e il get ha restituito qualcosa e però non va uguale al metodo successivo.. in teoria quando lui chiama onSuccess() vuol dire ha eseguito il get e restituito qualcosa almeno pensavo così.

La cosa che non mi torna è che la Textview me la setta con il risutato e quindi in teoria facendo l'if subito dopo mi dovrebbe settare anche la URL ma non lo fa..


Edit::-->  sto facendo dei degub e praticamente a questo punto mi salta sempre all' else eppure l'if dovrebbe funzionare..

                                                 
Codice (Java): [Seleziona]
 
                                                      JSONObject jsonObject = response.getJSONObject("content");
                                                       
                                                        category = jsonObject.getString("categoria");          
                                                        TextView t1;
                                                        t1 = (TextView) findViewById(R.id.textView1);
                                                        t1.setText(category);
                                                     if (t1.getText() == "Studente") {

                                                                url = "https://indirizzo";
                                                       

                                                        }

                                                        else {

                                                                url = "bb";
                                                        }


Edit2:--> confermo il controllo non funziona perchè se metto != anzichè == funziona..quindi sbaglio a verificare se il contenuto della textView è uguale a Studente..

Post unito: 04 Novembre 2013, 17:10:56 CET
non è proprio elegante ma ho risolto in questa maniera, dove nel metodo attemptLogin(); ho messo l altra richiesta.


Codice (Java): [Seleziona]
private void checkuser() {
                // TODO Auto-generated method stub
                RequestParams p = new RequestParams();
                mUsername = mUsernameView.getText().toString();
                p.put("user", mUsername);
                AsyncHttpClient client = new AsyncHttpClient();
        client.get("http://api.frapi/getusertype.json", p,
                                new JsonHttpResponseHandler() {

                                        @Override
                                        public void onSuccess(JSONObject response) {
                                               

                                                try {

                                                        JSONObject jsonObject = response.getJSONObject("content");
                                                       
                                                        category = jsonObject.getString("categoria");          
                                                        TextView t1;
                                                        t1 = (TextView) findViewById(R.id.textView1);
                                                        t1.setText(category);
                                                        String confronto = "Studente";
                                                        String c = (String) category;
                                                        if (c.equalsIgnoreCase(confronto)) {

                                                                url = "https://indirizzo";
                                                       

                                                        }

                                                        else {

                                                                url = "bb";
                                                        }
                                                        attemptLogin();
                                                       
                 
                                                } catch (JSONException e) {
                                                        // TODO Auto-generated catch block
                                                        e.printStackTrace();
                                                }

                                        }
               

                                        @Override
                                        public void onStart() {
                                                showProgress(true);
                                        }
                                });

« Ultima modifica: 04 Novembre 2013, 17:11:57 CET da felasandroid, Reason: Merged DoublePost »