Autore Topic: ListArray si aggiorna topo AsyncTask  (Letto 114 volte)

Offline nigiu

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung s3neo
  • Sistema operativo:
    Mac
ListArray si aggiorna topo AsyncTask
« il: 16 Aprile 2017, 17:56:44 CEST »
0
Ciao a tutti, ho il seguente codice:

Codice (Java): [Seleziona]
//variabili:
List<Integer> id_array = new ArrayList();

//on create
protected void onCreate(Bundle savedInstanceState) {
......
funzione(stringa, id_array);
}

private funzione (String stringa, List<Integer> id){
List<Integer> idVecchi = id;
        System.out.println("id vecchi 1: "+idVecchi);
        TaskProva taskProva = new TaskProva();
        try {
            JSONArray jsonArray = taskProva.execute(....).get();
            int count = jsonArray.length();
            for (int i = 0; i < count; i++) {
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                Integer id_n = jsonObject.getInt("id_n");
                if (!id_array.contains(id_n)){
                    id_array.add(id_d);
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }
        List<Integer> idNuovi = id_array;
        System.out.println("vecchi"+idVecchi);
        System.out.println("nuovi"+idNuovi);
}

private class TaskProva extends AsyncTask<String,Void,JSONArray>{
@Override
        protected JSONArray doInBackground(String... params) {
        ........
return jsonArray

}
}

il problema è che mi aspetto che idVecchi sia vuoto poiché inizialmente, quando richiamo la funzione "funzione(stringa,id_array)" nell'on create id_array è vuoto e idNuovi invece dovrebbe essere pieno dopo che la asyncTask è stata eseguita. Ciò però non accade, o meglio sia idVecchi che idNuovi hanno lo stesso valore , mentre la stampa prima dell'AsyncTask di idVecchi risulta effettivamente un Array vuoto!
Perché accade ciò? Come posso ovviare a tale problema? Grazie mille..

Offline iClaude

  • Utente normale
  • ***
  • Post: 212
  • Respect: +13
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:ListArray si aggiorna topo AsyncTask
« Risposta #1 il: 17 Aprile 2017, 13:52:38 CEST »
0
Se ho capito bene, il problema è che vengono riempiti sia idVecchi che IdNuovi?
Se è così il motivo è molto semplice. Con l'istruzione:
List<Integer> idVecchi = id;
idVecchi viene posto uguale a id, che corrisponde a id_array. Poi nel ciclo riempi id_array, e quindi automaticamente anche idVecchi, perché sono lo stesso oggetto. Infine poni idNuovi = id_array.
In pratica stai lavorando sempre con lo stesso oggetto, con la stessa lista.

Offline nigiu

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung s3neo
  • Sistema operativo:
    Mac
Re:ListArray si aggiorna topo AsyncTask
« Risposta #2 il: 17 Aprile 2017, 22:11:26 CEST »
0
ok sono lo stesso oggetto, ma io l'assegnazione idVecchi= id gliela faccio prima di eseguire la Task con la quale vado a modificare la variabile id per poi assegnarla a idNuovi. Mi aspetto che idVecchi e idNuovi abbiano valore diverso! Ti faccio un esempio per spiegarmi meglio:
Richiamo la funzione... funzione("Stringa", 1)...
mi aspetto che idVecchi sia pari ad 1, poi viene eseguita la Async Task la quale va a modificare il valore di id_array ad esempio adesso sarà pari a [1,2]. Impongo che idNuovi= id_array e poi parto con i system.out..
mi aspetto " idVecchi = 1  e idNuovi = [1,2] perché ok sono lo stesso oggetto, però l'assegnazione idVecchi = id_array è avvenuta prima della Task.. non so se ho reso..

Offline iClaude

  • Utente normale
  • ***
  • Post: 212
  • Respect: +13
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:ListArray si aggiorna topo AsyncTask
« Risposta #3 il: 17 Aprile 2017, 23:30:17 CEST »
0
Con l'istruzione:
List<Integer> idVecchi = id;
il reference idVecchi punta alla stessa locazione di memoria di id che è id_array (i reference funzionano in modo diverso dalle normali variabili).
Se modifichi id_array modifichi anche idVecchi.
Se vuoi copiare il contenuto (dati primitivi) mantenendo oggetti distinti devi usare es.:
List<Integer> idVecchi = new ArrayList (id);
« Ultima modifica: 17 Aprile 2017, 23:32:07 CEST da iClaude »

Offline nigiu

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung s3neo
  • Sistema operativo:
    Mac
Re:ListArray si aggiorna topo AsyncTask
« Risposta #4 il: 17 Aprile 2017, 23:55:00 CEST »
0
Grazie per la risposta, non appena possibile proverò la tua soluzione e approfondirò questo aspetto. Grazie mille!

Post unito: [time]18 Aprile 2017, 18:07:22 CEST[/time]
Ho appena testato il tutto e capito meglio il mio errore, perché pensavo fosse più un problema di Async Task. Ti ringrazio per la disponibilità! Grazie mille iClaude sia per la risposta:-)
« Ultima modifica: 18 Aprile 2017, 18:09:51 CEST da nigiu »