Autore Topic: AsynkTask problemi con l'attesa  (Letto 599 volte)

Offline Raffyna

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc wildfire
  • Sistema operativo:
    seven
AsynkTask problemi con l'attesa
« il: 29 Maggio 2015, 14:13:11 CEST »
0
Ciao,
ho sviluppato un'applicazione che invia e riceve delle richieste ad un server [Ad esempio invia i dati di una registrazione utente ed aspetta l'esito della registrazione dal server ].
L'applicazione per come è stata sviluppata attualmente non presenta problemi ma non sono convinta che il modo in cui ho sviluppato la connessione sia corretta.
Vi spiego cosa ho fatto :
Ho creato una classe java che prevede di prendere i dati forniti dall'utente - Name, Surname, Phone, Password...-  ed avvia l'asynktask di connessione per inviare dati al server
Per poter leggere il json di riposta dal server ho inserito un While vuoto, ovvero un while che non fa nulla fino a quando il Json che sto aspettando non si è riempito, a quel punto si procede con l'analisi del json ottenuto.

CLASSE REGISTER
Codice (Java): [Seleziona]
public class Register extends FragmentActivity {
       
        Button btnRegister;
        Button btnLinkToLogin;
        EditText inputNome,inputCognome, inputEmail, inputPassword,inputPhone, inputPlate;
        TextView registerErrorMsg;
       
        // JSON Response node names
        private static String KEY_SUCCESS = "success";
        private static String KEY_UID = "uid";
        private static String KEY_NAME = "name";
        private static String KEY_EMAIL = "email";
        AlertDialogManager alert ;
       
       JSONObject json;
       
        SessionManager session;
       
        public RegisterFragment(){
               
        }
       

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.fragment_register);
           
            alert = new AlertDialogManager();
                // Importing all assets like buttons, text fields
                inputNome = (EditText) findViewById(R.id.registerName);
                inputEmail = (EditText) findViewById(R.id.registerEmail);
                inputCognome = (EditText) findViewById(R.id.registerSurname);          
                inputPassword = (EditText) findViewById(R.id.registerPassword);
                inputPhone = (EditText) findViewById(R.id.registerPhone);
                inputPlate = (EditText) findViewById(R.id.registerPlate);
                btnRegister = (Button) findViewById(R.id.btnRegister);
                btnLinkToLogin = (Button) findViewById(R.id.btnLinkToLoginScreen);
               
               
                try {
                        registrationFunction();
                } catch (NumberFormatException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }      
                }

       
       
       
        protected void registrationFunction() throws NumberFormatException, JSONException {
     
                btnRegister.setOnClickListener(new View.OnClickListener() {                    
                        public void onClick(View view) {
                                /*Recupero i dati inseriti dall'utente*/
                                String name = inputNome.getText().toString();
                                String surname = inputCognome.getText().toString();                            
                                String email = inputEmail.getText().toString();
                                String password = inputPassword.getText().toString();
                                String phone = inputPhone.getText().toString();
                               
                                if(email.trim().length() >0 && password.trim().length()>0)
                                {
                                       
                                        UserFunctions userFunction = new UserFunctions();
                                       
                                       
                                        SingletonClass.getSingletonIstance();
                                        SingletonClass.setJson(null);
                                       
                                         // AVVIO ASYNK TASK
                                        userFunction.registerUser(name,surname,matr,email,phone, password,"1");
       
                               
                                     //ASPETTO CHE IL JSON SI RIEMPIE
                                     while(SingletonClass.getJson() == null){
                                                //do nothing
                                        }
                               
                                    //PROCEDO CON IL PARSING
                                        json = SingletonClass.getJson();
                                       
                                                //Controllo sul JSON
                                               
                                                if (SingletonClass.getJson() != null)
                                                        {
                                                       
                                                                String res;
                                                        try {
                                                                        res = SingletonClass.getJson().getString("success");
                                                                        System.err.println("Res "+res +" EAEUALS "+res.equals("1")+" Integer : "+(Integer.valueOf(res)==1));
                                                                       
                                                                        if(res.equals("1"))
                                                                        {                                                                              
                                                                                String type = SingletonClass.getJson().getString("type");
                                                                                JSONObject json_user = SingletonClass.getJson().getJSONObject("user");
                                                                               
                                                                                SingletonClass.setID_U(json_user.getString("id"));
                                                                               
                                                                               
                                                                                        SingletonClass.setNome(json_user.getString("name"));
                                                                                        SingletonClass.setCognome(json_user.getString("surname"));
                                                                                        SingletonClass.setID_U(json_user.getString("id"));
                                                                                        SingletonClass.setPlate(inputPlate.getText().toString());
                                                                                       
                                                                                       
                                                                                         SingletonClass.setJson(null);
                                                                                        serFunction.assignment(SingletonClass.getID_U(),"9");
                                                                                       
                                                                                               
                                                                                                /* Gestione Sessione U*/
                                                                                                session = new SessionManager(getApplicationContext());  
                                                                                                session.createLoginSession(SingletonClass.getID_U(),SingletonClass.getNome(), email);
                                                                                               
                                                                               
                                                                                                finish();
                                                                        }else if(SingletonClass.getJson().getString("error").equals("1") || SingletonClass.getJson().getString("error").equals("2")) //Errore nella registrazione
                                                                          {  
//                                                                                SingletonClass.setError_msg(SingletonClass.getJson().getString("error_msg"));

                                                                                  alert.showAlertDialog(RegisterFragment.this, "Registration failed..", "Please, try again!\n"+SingletonClass.getJson().getString("error_msg"), false);
                                                                                 
                                                                          }
                                                                } catch (JSONException e) {
                                                                        // TODO Auto-generated catch block
                                                                        e.printStackTrace();
                                                                } catch (IOException e) {
                                                                        //Errore Assignment
                                                                        e.printStackTrace();
                                                                }
                                                       
                                                         }else {
                                                                    System.out.println(" REPLY. JSON E'  NULLO");
                                                         }
                                               
                                }else{
                                        alert.showAlertDialog(RegisterFragment.this, "Registration failed..", "Please, insert data.", false);
                                }
                        }
                });
       
               
                // Link to Login Screen
                        btnLinkToLogin.setOnClickListener(new View.OnClickListener()
                                {
                                        public void onClick(View view)
                                        {
                                                Intent login = new Intent(RegisterFragment.this,LoginFragment.class);
                                                startActivity(login);
                                        }
                                });
        }
}

Ciò che mi rende perplessa è la presenza del while che non fa nulla. Avreste qualche idea a riguardo ? Con cosa potrei sostituire questo while?

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:AsynkTask problemi con l'attesa
« Risposta #1 il: 29 Maggio 2015, 14:41:44 CEST »
0
Ti dico come ho fatto io una cosa del genere.

Ho usato una libreria come okhttp, che fornisce la possibilità di fare richieste http in modo asincrono (cioè gestisce da sola un asynctask e restituisce la risposta ad una callback) o sincrono (cioè la funzione rimane in sospeso finchè non torna la risposta http). Facendo io un AsyncTask, ho usato la versione sincrona che da sola rimane in sospeso fino a che non arriva la risposta (non serve il while per attendere).
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Raffyna

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc wildfire
  • Sistema operativo:
    seven
Re:AsynkTask problemi con l'attesa
« Risposta #2 il: 29 Maggio 2015, 14:56:49 CEST »
0
Ciao Bradipo,
quindi hai creato un asynktask sincrono, ma in che modo ?

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:AsynkTask problemi con l'attesa
« Risposta #3 il: 29 Maggio 2015, 15:33:19 CEST »
0
Ciao Bradipo,
quindi hai creato un asynktask sincrono, ma in che modo ?

No, semplicemente ho messo nell'AsyncTask la richiesta di rete sincrona (cioè che rimane bloccante fino a che non ritorna). Chiaramente quella sincrona non sarebbe usabile nel thread di UI, mentre lo è dentro un AsyncTask che è di per sé asincrono.

Guarda questa pagina di esempio, ci sono sia la chiamata sincrona che quella asincrona di okhttp.

https://github.com/square/okhttp/wiki/Recipes
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Raffyna

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc wildfire
  • Sistema operativo:
    seven
Re:AsynkTask problemi con l'attesa
« Risposta #4 il: 29 Maggio 2015, 17:07:14 CEST »
0
Grazie Bradipo!
Mi metto subito a studiarlo:D