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

    Problema con variabili nei Thread

    Ciao a tutti, sto realizzando un progetto Android ed ho un problema che spero possiate aiutarmi a risolvere in quanto si tratta sempre di Java. In sostanza io ho una classe Model dove apro all'interno di un thread una connessione ad un server remoto e richiedo una pagina che fa una query e restituisce una stringa. All'interno del metodo che fa tutto questo, all'interno del thread va tutto bene e stampo i dati quindi ho la certezza di averli, devo recuperare questi risultati da un'altra classe "Controller" che utilizza il Model, ma li perdo!!!!

    Ho pensato di creare una classe Costanti con dei metodi set e get che uso nel Model, vi faccio vedere il codice, sapreste dirmi secondo voi cosa non va e perchč perdo le variabili?:

    Costanti

    codice:
    public class Costanti {
        String regioni="";
    
        public Costanti(){}
    
        public void setRegioni(String regioni){this.regioni=regioni;}
        public String getRegioni(){return regioni;}
    }


    Model

    codice:
    public void launchService() throws MalformedURLException, IOException {
         AsyncTask.execute(new Runnable() {
            @Override
    public void run() {
    
                String result = null;
                StringBuffer sb = new StringBuffer();
                InputStream is=null;
                URL url = null;
                try {
                    String registrationUrl = "***URL***";
                    url = new URL(registrationUrl);
                    URLConnection connection = url.openConnection();
                    HttpURLConnection httpConnection = (HttpURLConnection) connection;
                    int responseCode = httpConnection.getResponseCode();
                    if (responseCode == HttpURLConnection.HTTP_OK) {
    
    
                    try {
                        is = new BufferedInputStream(connection.getInputStream());
                        BufferedReader br = new BufferedReader(new InputStreamReader(is));
                        String inputLine = "";
                        while ((inputLine = br.readLine()) != null) {
                            sb.append(inputLine);
                        }
                        result = sb.toString();
    
                        //c č l'oggetto Costanti dichiarato all'esterno ed č globale
                        c.setRegioni(result);
                    }
    
                        catch (Exception e) {
                            Log.e("TAG", "Error reading InputStream");
                            result = null;
                        }
                        finally {
                            if (is != null) {
                                try {
                                    is.close();
                                }
                                catch (IOException e) {
                                    Log.e("TAG", "Error closing InputStream");
                                }
                            }
                        }
                    } else {
                        Log.e("MyApp", "Registration failed for: " + registrationUrl);
                    }
    
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
    
            }
        });
    
    }
    Controller

    codice:
    Model m=new Model();try {
       m.launchService();
        Costanti c=new Costanti();
        Log.e("controller:",c.getRegioni());
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Darčios89 Visualizza il messaggio
    Ho pensato di creare una classe Costanti con dei metodi set e get che uso nel Model, vi faccio vedere il codice, sapreste dirmi secondo voi cosa non va e perchč perdo le variabili?:
    Innanzitutto c'č la questione legata al multi-threading: senza gli opportuni accorgimenti, NON c'č alcuna garanzia che quello che scrive (in memoria) un thread sia "visibile" da un altro thread.
    Č un concetto che vale in generale sulla piattaforma Java e credo che vale sicuramente anche sulla piattaforma Android. E va compreso ... compreso bene.

    Ma poi c'č anche un altro problema in quello che hai scritto. Se nel controller hai:

    codice:
    Model m=new Model();try {
       m.launchService();
        Costanti c=new Costanti();
        Log.e("controller:",c.getRegioni());
    }

    Hai istanziato un oggetto Costanti e quindi il Model ... quale oggetto Costanti usa? Sicuramente un altro. E se sono oggetti differenti, come pensi di poter passare dei dati? (oltre alle questioni sulla "visibilitą" delle modifiche).
    Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet

  3. #3
    Si sul discorso thread so che non c'č visibilitą. In effetti non ho riflettuto sul fatto che sia un'istanza diversa. Come potrei fare allora? Mi verrebbe da pensare che dovrei utilizzare una variabile all'interno di Model cosģ dopo aver creato l'istanza nel Controller e richiamato il metodo se accedo ad un'istanza del Model dove ho salvato i valori dovrei avere quelli corretti? Se riesci a spiegarmi mi faresti un grosso favore sono fermo da giorni....

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.