Sto lavorando a un app android ma la domanda riguarda java in generale.
L'applicazione è l'equivalente dell' android market. Punto in qiestione: quando visualizzo i dettagli di una applicazione deve partire il download in background in modo che non mi si blocchi la gui. I file da scaricare sono file . zip di grandezza tra i 2 e 20 mega che salverò sulla mia sd.
Il mio codice è il seguente che ammetto di aver in parte scopiazzato in rete perchè su questa parte sn carente e che sta dentro una classe ch estende service(che sn classi di android che girano in background ma cmq sullo stesso thread della gui)
Domande:codice:if (mu.canReadFromExternalStorage()) //controlla che la sd sia legibile e scrivibile { try { URL url = new URL("http://62.101.121.49:8080/applicazioni/prova.zip"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setDoOutput(true); conn.setDoInput(true); conn.setRequestProperty("content-type", "binary/data"); conn.connect(); //questa riga serve? File SDCardRoot = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOAD) // dove salverò il file boolean success = (SDCardRoot).mkdirs();// crea la directory se non c'è File file = new File(SDCardRoot,"prova.zip"); file.createNewFile();// QUesta riga serve? FileOutputStream fileOutput = new FileOutputStream(file,false); InputStream inputStream = conn.getInputStream(); int totalSize = conn.getContentLength(); int downloadedSize = 0; byte[] buffer = new byte[1024]; int bufferLength = 0; while ( (bufferLength = inputStream.read(buffer)) > 0 ) { fileOutput.write(buffer, 0, bufferLength); downloadedSize += bufferLength; } System.out.println("fato tutto chiudo"); fileOutput.close(); inputStream.close(); conn.disconnect();// Questa linea serve o meglio tenere la connessione aperta? catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } else System.out.println("Non posso scrivere o legger dalla sd"); }
1)
Volevo sapere è un approccio corretto sicuro e efficente per scaricare?
Alcuni suggeriscono di usare un buffered streams. Il che suppongo voglia dire cambiare questa riga FileOutputStream fileOutput = new FileOutputStream(file,false);
in
qualcosa tipo new BufferedOutputStream(new FileOutputStream(file,false));
Ma non mi è chiaro cosa cambie e che vantaggio ne abbia......
2)Cosa cambia da uqanto sto facendo io a usare un socket????
3)Alcune linee del codice sn commentate con "questa linea serve?" perchè se le tolgo non mi accorgo della differenza.........
4)Quel che mi manca da fare è metter il tutto dentro un bel thread in modo che non si blocchi la gui mentre scarica.......dato però che io vorrei poter scaricare più file alla volta, ovvero ne faccio partire uno, poi intanto cerco una altra app e metto pure quella in download, c'è qualche cosa in più da fare o ogni volta ch creerò un nuovo thread questo farà tutto il lavoro sporco da se senza problemi?
Grazie

Rispondi quotando

