Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [Android] HashMap non viene aggiornata

    Salve.

    Come mai se faccio una cosa del genere:

    (questo avviene dentro doInBackground di un AsyncTask)
    codice:
    HashMap<String, String> map = new HashMap<String, String>();
    QueryUtils.queryNumberOfStudents(classroomText, map);
    QueryUtils.queryNumberOfSeats(classroomText, map);
    Dove le query sono in un'altra classe, per esempio:

    codice:
    public static void queryLecture(String classroomText, final HashMap<String, String> myMap) {
            HashMap<String, String> map = new HashMap<>();
            map.put("getLabel", classroomText);
            ParseCloud.callFunctionInBackground("getCurrentLesson", map, new FunctionCallback<String>() {
                @Override
                public void done(String result, ParseException e) {
                    if (e == null) {
                        myMap.put(myKey, result);
                    } else {
                        Log.e("Current lecture error: ", e.getMessage());
                    }
                }
            });
        }

    Quando le query hanno successo, nella classe contenente le query vedo che i risultati vengono messi nella mappa, ma nella classe chiamante la mappa risulta vuota.

    l'onPostExecute di un AsyncTask (metodo dove io devo usare effettivamente i dati inseriti nella mappa) viene eseguito solo quando doInBackground, ha terminato.

    Attualmente per aggirare questo problema all'avvio dell'activity creo un'istanza di un mio oggetto java-bean che uso al posto della mappa che vi ho mostrato. Solo che così è tutto un po troppo complesso per i miei gusti perché devo usare il pattern Observer per far capire all'Activity che il mio oggetto ha cambiato stato!

    Sono costretto in questi problemi perché purtroppo a causa della loro struttura le query non possono ritornarmi un valore, ma solo fare side-effect su qualche oggetto.

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Io in quel codice ci vedo una cosa strana... non capisco quella variabile myKey che viene usata all'interno del metodo done() da dove salti fuori.

    Poi... nella premessa dici "questo avviene dentro doInBackground di un AsyncTask"... poi dici "l'onPostExecute di un AsyncTask (metodo dove io devo usare effettivamente i dati inseriti nella mappa)"... però se la mappa è "dichiarata" (e istanziata) dentro il doInBackground() di sicuro non è visibile in onPostExecute()... a meno che la mappa non sia l'effettivo valore di ritorno del doInBackground() (e quindi passata come parametro al onPostExecute() ).

    Insomma, non è molto chiaro il contesto d'uso di quella mappa.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Ci sono delle cose che ho assunto nel discorso. Quella chiave l'ho messa così a caso, in realtà ne prendo una reale (definita come public static final, nella classe chiamante, per capire quale valore sto inserendo). Comunque infatti il mio doInBackground ritorna la mappa stessa, e l'onPostExecute la prende come parametro. Comunque facendo debug, la mappa risulta vuota già dentro il doInBackground dopo la chiamata alle query.

    Cioè non capisco perché un mio oggetto venga modificato e un'HashMap no.
    Ultima modifica di Javino89; 09-06-2015 a 14:58

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.