Autore Topic: Problema con AsyncHttpClient  (Letto 368 volte)

Offline Darèios89

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2
Problema con AsyncHttpClient
« il: 19 Luglio 2016, 20:48:46 CEST »
0
Ciao a tutti, ho fatto una connessione ad un database su un server remoto, tutto funziona, vi posto il metodo e dopo il problema:

Codice: [Seleziona]
public String getRegioni(){

            AsyncHttpClient client = new AsyncHttpClient();
            RequestParams params = new RequestParams();
            params.put("action", "regioni");

        client.get("http://*****URL***", params, new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, cz.msebera.android.httpclient.Header[] headers, byte[] responseBody) {

                String tmp = new String(responseBody, StandardCharsets.UTF_8);
                //String regioni=gson.fromJson(tmp, String.class);
                //Log.e("Fatto:",tmp);
                regioni+=tmp;

            }

            @Override
            public void onFailure(int statusCode, cz.msebera.android.httpclient.Header[] headers, byte[] responseBody, Throwable error) {

            }
        });

        Log.e("reg:",regioni);
        return regioni;
    }


All'interno del metodo onSuccess tutto funziona in quanto vengono stampati i valori, regioni è una variabile globale dichiarata ad inizio classe dove vorrei memorizzare il contenuto di tmp. Il problema è che fuori da quel metodo perdo tutto e non viene memorizzato nulla, infatti il log prima della return da NullPointerException, come potrei risolvere?

Offline tonno16

  • Utente storico
  • *****
  • Post: 1169
  • Respect: +56
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Problema con AsyncHttpClient
« Risposta #1 il: 19 Luglio 2016, 21:17:12 CEST »
0
Normale. Sono thread. Quel return è inutile perché non conterrà mai i dati stringa. Solo dentro onSucces() devi lavorare

Offline Darèios89

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2
Re:Problema con AsyncHttpClient
« Risposta #2 il: 19 Luglio 2016, 22:24:45 CEST »
0
Si ma dal momento che "regioni" è una variabile globale perché all'interno di onsuccess il valore impostato non si mantiene fuori? È un problema perché mo serviva una rerurn del valore, lavorando su onsuccess non so come recuperare il valore altrove.

Offline DCode

  • Utente junior
  • **
  • Post: 69
  • Respect: +20
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 16.04 LTS
Re:Problema con AsyncHttpClient
« Risposta #3 il: 20 Luglio 2016, 08:33:21 CEST »
0
Il problema è che essendo metodi Asincroni ti esegue sicuramente prima il return della variabile e poi passa nell'onSuccess dove fai le varie assegnazioni.

Citazione
Solo dentro onSucces() devi lavorare
Questa è l'unica soluzione, puoi comunque gestire il tutto in quel metodo.

Buona giornata  ;-)
┻━┻ ︵ヽ(°□°ヽ) Develop w/ ( ( ObjC || Swift ) && Java[ "Android" ] ) (╯°□°)╯︵ ┻━┻

Offline Darèios89

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2
Re:Problema con AsyncHttpClient
« Risposta #4 il: 20 Luglio 2016, 10:34:19 CEST »
0
Si sto provando diverse cose, il fatto è che anche se usassi dei metodi come dei get() e set() per settare la variabile globale sempre all'interno dell'onsuccess tutto funziona ma all'esterno perdo tutto, e usando un metodo del tipo getRegioni() ottengo sempre null. Sapreste suggerirmi come mandare ad un'altra activity questo valore? Non ne ho proprio idea...la classe su cui sto lavorando adesso che usa i thread non è un'activity ma una normale classe Java.
« Ultima modifica: 20 Luglio 2016, 10:48:09 CEST da Darèios89 »

Offline DCode

  • Utente junior
  • **
  • Post: 69
  • Respect: +20
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 16.04 LTS
Re:Problema con AsyncHttpClient
« Risposta #5 il: 20 Luglio 2016, 12:11:53 CEST »
0
Io opterei per l'utilizzo di una "Interface", utilizzandola nell'onSuccess poi puoi chiamare tranquillamente metodi implementati nella tua Activity.
┻━┻ ︵ヽ(°□°ヽ) Develop w/ ( ( ObjC || Swift ) && Java[ "Android" ] ) (╯°□°)╯︵ ┻━┻

Offline Darèios89

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2
Re:Problema con AsyncHttpClient
« Risposta #6 il: 20 Luglio 2016, 13:02:02 CEST »
0
Non so se ho capito, ho fatto una prova ma non funziona, creo un' interfaccia esterna del tipo:

Codice: [Seleziona]
public interface Prova {

        void setRegioni(String value);
        String getRegioni();

}


Poi dalla classe che interroga il db implemento questi metodi settando una variabile globale:


Codice: [Seleziona]
public class Model implements Prova {

    String regioni;

    @Override
    public void setRegioni(String regioni) {
        this.regioni = regioni;
    }

    @Override
    public String getRegioni() {
        return regioni;
    }

    public Model(){

    }

    public void retrieveRegioni(){

            AsyncHttpClient client = new AsyncHttpClient();

            RequestParams params = new RequestParams();
            params.put("action", "regioni");

        client.get("http://***URL***", params, new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, cz.msebera.android.httpclient.Header[] headers, byte[] responseBody) {

                String tmp = new String(responseBody, StandardCharsets.UTF_8);
                setRegioni(tmp);


            }

            @Override
            public void onFailure(int statusCode, cz.msebera.android.httpclient.Header[] headers, byte[] responseBody, Throwable error) {

            }
        });

    }
}


Però se poi da un'altra classe faccio questo, ottengo sempre null;

Codice: [Seleziona]
Model m=new Model();
            m.retrieveRegioni();
            String s=m.getRegioni();
            Log.e("prova",s);

Offline DCode

  • Utente junior
  • **
  • Post: 69
  • Respect: +20
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 16.04 LTS
Re:Problema con AsyncHttpClient
« Risposta #7 il: 20 Luglio 2016, 16:00:42 CEST »
0
L'implement dell'interfaccia la devi fare nell'activity dove chiami la tua classe Model.
Poi
  • Crei un'istanza dell'interfaccia nella classe Model
  • Nell'onSuccess() chiami il metodo setRegioni(...)
  • Ritornando nella activity dove hai implementato l'interfaccia ( dovendo fare l'override obbligatorio di tutti i metodi ) ti gestisci il metodo setRegione(...) per settarlo ad una string nella activity stessa/li]
Spero di essere stato chiaro  ;-)
┻━┻ ︵ヽ(°□°ヽ) Develop w/ ( ( ObjC || Swift ) && Java[ "Android" ] ) (╯°□°)╯︵ ┻━┻

Offline Darèios89

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2
Re:Problema con AsyncHttpClient
« Risposta #8 il: 20 Luglio 2016, 20:56:22 CEST »
0
Si sicuramente è una cosa banale, ma mi sa che concettualmente non la afferro... :-P
Ti chiedo ancora un pò di pazienza perchè non riesco a farla funzionare quindi deduco di fare le cose in modo errato, sono bloccato da un pò e non riesco ad andare avanti senza questo. Cosa intendi per creare istanze di un'interfaccia? A quanto sapevo non è una cosa possibile. Posto le classi per come le ho rifatte, abbiamo una interface, un Model dove viene fatta la query, e la classe Controller che utilizza Model:

Interfaccia:

Codice: [Seleziona]
public interface Prova {


        void setRegioni(String value);
        String getRegioni();

}


Model:

Codice: [Seleziona]
public class Model {

    Prova p;
    public Model(){

    }

    public void retrieveRegioni(){

            AsyncHttpClient client = new AsyncHttpClient();

            RequestParams params = new RequestParams();
            params.put("action", "regioni");

        client.get("***URL***", params, new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, cz.msebera.android.httpclient.Header[] headers, byte[] responseBody) {

                String tmp = new String(responseBody, StandardCharsets.UTF_8);
                p.setRegioni(tmp);


            }

            @Override
            public void onFailure(int statusCode, cz.msebera.android.httpclient.Header[] headers, byte[] responseBody, Throwable error) {

            }
        });

    }
}


Controller:

Codice: [Seleziona]
public class Controller extends AppCompatActivity implements Prova {

    private static String action;
    private String regioni;


    @Override
    public void setRegioni(String regioni) {
        this.regioni = regioni;
    }

    @Override
    public String getRegioni() {
        return regioni;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_controller);
     }
         .
         .
         .
         .
         
            Model m=new Model();
            m.retrieveRegioni();
            Log.e("result",getRegioni());


Offline Darèios89

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2
Re:Problema con AsyncHttpClient
« Risposta #9 il: 23 Luglio 2016, 00:24:25 CEST »
0
Help!  :-(