Autore Topic: Tempi di download con AsyncTask  (Letto 662 volte)

Offline ienariden

  • Nuovo arrivato
  • *
  • Post: 25
  • Respect: 0
    • Mostra profilo
Tempi di download con AsyncTask
« il: 03 Agosto 2011, 13:03:46 CEST »
0
Salve ragà,
volevo sottoporvi una domanda...ho creato due versioni della mia applicazione la quale deve scaricare un file da internet. In pratica una versione scarica il file direttamente nell'activity principale, mentre l'altra versione lo fa utilizzando un asynctask (questo perchè volevo visualizzare un processdialog per visualizzare lo stato di avanzamento del download). Solo che la versione con asynctask ci mette un'infinità di tempo in più...è vero che sul mio pc l'emulatore va lentissimo, però in rapporto alla versione senza asynctask la seconda ci mette tipo 20 volte tanto!
E' normale secondo voi o c'è qualcosa che non và?
Grazie ragà

Offline denper

  • Utente normale
  • ***
  • Post: 290
  • Respect: +60
    • Mostra profilo
    • Anddenper
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    denper
  • Sistema operativo:
    Window 7, Windows XP
Re:Tempi di download con AsyncTask
« Risposta #1 il: 03 Agosto 2011, 13:26:37 CEST »
0
Non mi sembra normale, guarda bene il codice, in ogni caso non riesci a testare l'app nel tuo dispositivo?
Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. [A.Einstein]

Proteggi la tua privacy! Utilizza GhostPhone! https://play.google.com/store/apps/details?id=com.denper.gp
Giochi a Winforlife e Superenalotto e sei stanco di controllare le tue schedine manualmente? Prova Checkwin: https://play.google.com/store/apps/details?id=com.denper.checkwintrial

Offline ienariden

  • Nuovo arrivato
  • *
  • Post: 25
  • Respect: 0
    • Mostra profilo
Re:Tempi di download con AsyncTask
« Risposta #2 il: 03 Agosto 2011, 13:40:36 CEST »
0
sfortunatamente non ho un dispositivo....:( il codice dei due è uguale....effettuando il debug ho messo un breakpoint nel while che mi scarica il file ed è lì che noto la differenza di velocità...per questo penso che sia un problema di thread...

Offline denper

  • Utente normale
  • ***
  • Post: 290
  • Respect: +60
    • Mostra profilo
    • Anddenper
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    denper
  • Sistema operativo:
    Window 7, Windows XP
Re:Tempi di download con AsyncTask
« Risposta #3 il: 03 Agosto 2011, 13:42:45 CEST »
0
Se vuoi postare il codice, proviamo a darci un occhio...
Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. [A.Einstein]

Proteggi la tua privacy! Utilizza GhostPhone! https://play.google.com/store/apps/details?id=com.denper.gp
Giochi a Winforlife e Superenalotto e sei stanco di controllare le tue schedine manualmente? Prova Checkwin: https://play.google.com/store/apps/details?id=com.denper.checkwintrial

Offline ienariden

  • Nuovo arrivato
  • *
  • Post: 25
  • Respect: 0
    • Mostra profilo
Re:Tempi di download con AsyncTask
« Risposta #4 il: 03 Agosto 2011, 13:48:33 CEST »
0
quì c'è la mia activity con l'asynctask

Codice (Java): [Seleziona]
public class OverlayMapTestActivity extends MapActivity {
        /*
         * Tag del log
         */

        private final static String LOG_TAG = "OverlayMapTestActivity";
        /*
         * Location di Rovigo come location iniziale
         */

        private final static GeoPoint ROVIGO_GEO_POINT = new GeoPoint(45066667,
                        11783333);
        private ProgressDialog prgd;
        private final static int PROGRESS_DIALOG = 1;
        /*
         * Riferimento alla MapView
         */

        private MapView mapView;

        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                // Mettiamo la View a tutto schermo
                requestWindowFeature(Window.FEATURE_NO_TITLE);

                //createProgressDialog();
                //FileDManagerO fdm= new FileDManagerO();
                //fdm.DownloadFromUrl("http://wellnessvincente.info/wp-content/uploads/2010/07/Bellezza-colore-capelli.jpg","Bellezza-colore-capelli.jpg");
                showDialog(PROGRESS_DIALOG);
                FileDManager fdm= new FileDManager("http://wellnessvincente.info/wp-content/uploads/2010/07/Bellezza-colore-capelli.jpg","Bellezza-colore-capelli.jpg");
                fdm.execute("Downloading...");
                while(!fdm.getStatus().equals(Status.FINISHED)){}
                // Visualizziamo la Map
                setContentView(R.layout.main);


                // Otteniamo il riferimento alla MapView
                mapView = (MapView) findViewById(R.id.mapView);
                Log.i(LOG_TAG, "MapController obtained!");
                // Rendiamo la mappa cliccabile e quindi ne permettiamo
                // il pan
                mapView.setClickable(true);
                // Utiliziamo i controlli predefiniti per la gestione
                // delle operazioni di zoom
                mapView.setBuiltInZoomControls(true);
                LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
                Log.i(LOG_TAG,"LocationManager created!");
                //Location loc=locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                LocationListener lis= new LocationListener() {

                        @Override
                        public void onLocationChanged(Location location) {
                                Log.i(LOG_TAG,"onLocationChanged "+location.getLatitude()+":"+location.getLongitude());
                                Toast.makeText(OverlayMapTestActivity.this,
                                                "onLocationChanged "+location.getLatitude()+":"+location.getLongitude(), Toast.LENGTH_SHORT).show();

                        }

                        @Override
                        public void onProviderDisabled(String provider) {
                                Log.i(LOG_TAG,"onProviderDisabled "+provider);
                                Toast.makeText(OverlayMapTestActivity.this,
                                                "onProviderDisabled "+provider, Toast.LENGTH_SHORT).show();

                        }

                        @Override
                        public void onProviderEnabled(String provider) {
                                Log.i(LOG_TAG,"onProviderEnabled "+provider);
                                Toast.makeText(OverlayMapTestActivity.this,
                                                "onProviderEnabled "+provider, Toast.LENGTH_SHORT).show();
                        }

                        @Override
                        public void onStatusChanged(String provider, int status,Bundle extras) {
                                Log.i(LOG_TAG,"onStatusChanged "+provider+" status: "+status);
                                Toast.makeText(OverlayMapTestActivity.this,
                                                "onStatusChanged "+provider+" status: "+status, Toast.LENGTH_SHORT).show();

                        }

                };
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
                                0, lis);
                for(int i=0;i<2000;i++){}
                Location loc=locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                locationManager.removeUpdates(lis);
                GeoPoint start=new GeoPoint((int)(loc.getLatitude()), (int)(loc.getLongitude()));
                // Visualizziamo il punto iniziale
                mapView.getController().setCenter(start);
                mapView.getController().setZoom(9);
                mapView.setSatellite(true);
                // Gestiamo gli Overlay
                Drawable starImg = getResources().getDrawable(R.drawable.icon);
                VenetoCitiesOverlay overlays = new VenetoCitiesOverlay(starImg);
                mapView.getOverlays().add(overlays);
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                // Menù di gestione modalità di visualizzazione che, per renderle
                // checkable
                // le inseriamo in un sottomenu
                SubMenu mapSubMenu = menu.addSubMenu("Map Modes");
                mapSubMenu.setIcon(android.R.drawable.ic_menu_mapmode);
                int firstItem = Menu.FIRST;
                MenuItem trafficItem = mapSubMenu.add(1, firstItem, firstItem,
                "Traffic");
                trafficItem.setCheckable(true);
                trafficItem.setChecked(true);
                MenuItem satelliteItem = mapSubMenu.add(1, firstItem + 1,
                                firstItem + 1, "Satellite");
                satelliteItem.setCheckable(true);
                MenuItem streetViewItem = mapSubMenu.add(1, firstItem + 2,
                                firstItem + 2, "Street View");
                streetViewItem.setCheckable(true);
                // Visualizziamo il menu
                return true;
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
                // Modifichiamo lo stato di quella selezionata
                item.setChecked(!item.isChecked());
                // Abilitiamo o meno l'opzione relativa
                switch (item.getItemId()) {
                case Menu.FIRST:
                        mapView.setTraffic(item.isChecked());
                        break;
                case Menu.FIRST + 1:
                        mapView.setSatellite(item.isChecked());
                        break;
                case Menu.FIRST + 2:
                        mapView.setStreetView(item.isChecked());
                        break;
                }
                return super.onOptionsItemSelected(item);
        }

        @Override
        protected boolean isRouteDisplayed() {
                return false;
        }
        @Override
        protected Dialog onCreateDialog(int id) {
                switch (id) {
                case PROGRESS_DIALOG:
                        return createProgressDialog();
                default:
                        return null;
                }
        }



        @Override
        protected void onPrepareDialog(int id, Dialog dialog) {
                switch (id) {
                case PROGRESS_DIALOG:
                        //workerThread.start();
                        break;
                default:
                        // None
                }

        }
        private ProgressDialog createProgressDialog() {
                prgd = new ProgressDialog(this);
                prgd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                //prgd.setMessage("Caricamento...");
                prgd.setOnCancelListener(new OnCancelListener() {

                        @Override
                        public void onCancel(DialogInterface dialog) {
                                // Fermiamo l'AsyncTask
                                prgd.dismiss();
                        }

                });
                //workerThread = new CustomThread(myHandler);
                return prgd;
        }
        public class FileDManager extends AsyncTask<String, Integer, String>{

                private final String PATH = "/data/data/it.apogeo.android.cap11.overlaymaptest/";  //dove vorrei salvare il file
                private URL url;
                private File file;
                private String fileName;

                public FileDManager(String fileURL, String fileName) {  
                        try {
                                url = new URL(fileURL);
                        } catch (MalformedURLException e) {
                                // TODO Auto-generated catch block
                                Log.i("FileDMAnager",e.toString());
                        }
                        this.fileName=fileName;
                        file = new File(this.fileName);

                }
                @Override
                protected void onPreExecute (){
                        prgd.show();

                }
                @Override
                protected String doInBackground(String... params) {
                        prgd.setMessage(params[0]);
                        //publishProgress("\n" + params[0]);
                        // stringa passata a onProgressUpdate

                        /*Random rand = new Random();

                publishProgress("Loading module 1 ...");

                while (rand.nextInt(1000000) != 2) {
                }
                // "simuliamo" dei calcoli
                publishProgress("Loading module 2 ...");
                while (rand.nextInt(1000000) != 1) {
                }

                return "Finish !";
                // stringa passata a onPostExecute*/

                        try {
                                long startTime = System.currentTimeMillis();
                                Log.d("FileDManager", "download begining");
                                Log.d("FileDManager", "download url:" + url);
                                Log.d("FileDManager", "downloaded file name:" + fileName);
                                /* apro la connessione */
                                URLConnection ucon = url.openConnection();

                                /*
                                 * Definisco InputStreams x leggere dalla URLConnection.
                                 */

                                InputStream is = ucon.getInputStream();
                                BufferedInputStream bis = new BufferedInputStream(is);

                                /*
                                 * leggo dal buffer finchè posso(-1).
                                 */

                                ByteArrayBuffer baf = new ByteArrayBuffer(50);
                                int current = 0;
                                Integer prog= new Integer(0);
                                int k=0;
                                while ((current = bis.read()) != -1) {
                                        baf.append((byte) current);
                                        prog=new Integer(baf.length());
                                        publishProgress(prog);
                                        k++;
                                }
                                /* converto in stringa */
                                FileOutputStream fos = new FileOutputStream(PATH+file);
                                fos.write(baf.toByteArray());
                                fos.close();
                                Log.d("FileDManager", "download ready in"
                                                + ((System.currentTimeMillis() - startTime) / 1000)
                                                + " sec");
                                publishProgress(100);

                        } catch (IOException e) {
                                Log.d("FileDManager", "Error: " + e);
                        }
                        return "finito";


                }

                @Override
                protected void onProgressUpdate(Integer... values) {
                        prgd.setProgress(values[0].intValue());
                }

                @Override
                protected void onPostExecute(String result) {
                        prgd.setMessage(result);
                }
        }
}


e quì c'è la classe che mi scarica il file senza asynctask

Codice (Java): [Seleziona]
public class FileDManagerO {
 
        private final String PATH = "/data/data/it.apogeo.android.cap11.overlaymaptest/";  //dove vorrei salvare il file
       
 
        public void DownloadFromUrl(String fileURL, String fileName) {  
                try {
                        URL url = new URL(fileURL);
                        File file = new File(fileName);
 
                        long startTime = System.currentTimeMillis();
                        Log.d("FileDManager", "download begining");
                        Log.d("FileDManager", "download url:" + url);
                        Log.d("FileDManager", "downloaded file name:" + fileName);
                        /* apro la connessione */
                        URLConnection ucon = url.openConnection();
 
                        /*
                         * Definisco InputStreams x leggere dalla URLConnection.
                         */

                        InputStream is = ucon.getInputStream();
                        BufferedInputStream bis = new BufferedInputStream(is);
 
                        /*
                         * leggo dal buffer finchè posso(-1).
                         */

                        ByteArrayBuffer baf = new ByteArrayBuffer(50);
                        int current = 0;
                        int k=0;
                        while ((current = bis.read()) != -1) {
                                baf.append((byte) current);
                                k++;
                        }
 
                        /* converto in stringa */
                        FileOutputStream fos = new FileOutputStream(PATH+file);// quì ho l'eccezione
                        fos.write(baf.toByteArray());
                        fos.close();
                        Log.d("FileDManager", "download ready in"
                                        + ((System.currentTimeMillis() - startTime) / 1000)
                                        + " sec");
 
                } catch (IOException e) {
                        Log.d("FileDManager", "Error: " + e);
                }
 
        }
}

Offline denper

  • Utente normale
  • ***
  • Post: 290
  • Respect: +60
    • Mostra profilo
    • Anddenper
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    denper
  • Sistema operativo:
    Window 7, Windows XP
Re:Tempi di download con AsyncTask
« Risposta #5 il: 03 Agosto 2011, 14:20:54 CEST »
0
In effetti da uno sguardo veloce al codice mi sembra tutto ok. Io di solito per fare il download di un file e salvarlo uso la classe OutputStream (quello che hai scritto tu va comunque benissimo), magari se vuoi provare così:

Codice (Java): [Seleziona]
protected String doInBackground(String... url) {
        int count;
        try {
            URL url = new URL(url[0]);
            URLConnection con = url.openConnection();
            con.connect();
            // this will be useful so that you can show a tipical 0-100% progress bar
            int lenghtOfFile = con.getContentLength();

            // downlod the file
            InputStream input = new BufferedInputStream(url.openStream());
            OutputStream output = new FileOutputStream("tuo path");

            byte data[] = new byte[1024];

            long total = 0;

            while ((count = input.read(data)) != -1) {
                total += count;
                // publishing the progress....
                publishProgress((int)(total*100/lenghtOfFile));
                output.write(data, 0, count);
            }

            output.flush();
            output.close();
            input.close();
        } catch (Exception e) {}
        return null;
    }

Giusto per vedere....se poi è più veloce provo a dirti cosa potrebbe essere...
Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. [A.Einstein]

Proteggi la tua privacy! Utilizza GhostPhone! https://play.google.com/store/apps/details?id=com.denper.gp
Giochi a Winforlife e Superenalotto e sei stanco di controllare le tue schedine manualmente? Prova Checkwin: https://play.google.com/store/apps/details?id=com.denper.checkwintrial

Offline ienariden

  • Nuovo arrivato
  • *
  • Post: 25
  • Respect: 0
    • Mostra profilo
Re:Tempi di download con AsyncTask
« Risposta #6 il: 03 Agosto 2011, 14:43:20 CEST »
0
purtroppo non cambia niente....senti ma tu hai per caso provato il mio codice? xkè la progress dialog io non riesco a vederla...

Offline denper

  • Utente normale
  • ***
  • Post: 290
  • Respect: +60
    • Mostra profilo
    • Anddenper
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    denper
  • Sistema operativo:
    Window 7, Windows XP
Re:Tempi di download con AsyncTask
« Risposta #7 il: 03 Agosto 2011, 15:12:50 CEST »
0
Ciao,
purtroppo non posso provare il tuo codice perchè non ho accesso completo a internet (maledetto proxy!). Di solito io il progress dialog lo integro nell'AsyncTask in questo modo:

Definisco una variabile di classe nella mia Activity

Codice (Java): [Seleziona]
private AsyncTask<Void, Void, String> task = null;
creo un inner class per l'AsyncTask

Codice (Java): [Seleziona]
private class MyAsyncTask extends AsyncTask<Void, Void, String> {
                private ProgressDialog dialog = null;
                private Context context = null;

                public MyAsyncTask(Context context) {
                        super();
                        this.context = context;
                }

                @Override
                protected void onPreExecute() {
                        dialog = new ProgressDialog(context);
                        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                        dialog.setMessage("Loading...");
                        dialog.setIndeterminate(false);
                        dialog.setCancelable(true);
                        dialog.setOnCancelListener(new OnCancelListener() {
                                public void onCancel(DialogInterface dialog) {
                                        if (task != null) {
                                                // Prova a terminare il task
                                                task.cancel(true);
                                        }

                                }
                        });
                        dialog.show();
                }
               
                @Override
                protected String doInBackground(Void... params) {
                        ...
                        dialog.setProgress(<valore>);
                        ...
                        return "finito";
                }

                protected void onPostExecute(String result) {
                        ...
                        dialog.dismiss();

                }
}

lancio dalla classe principale il task

Codice (Java): [Seleziona]
task = new MyAsyncTask (this);
task.execute();
Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. [A.Einstein]

Proteggi la tua privacy! Utilizza GhostPhone! https://play.google.com/store/apps/details?id=com.denper.gp
Giochi a Winforlife e Superenalotto e sei stanco di controllare le tue schedine manualmente? Prova Checkwin: https://play.google.com/store/apps/details?id=com.denper.checkwintrial

Offline ienariden

  • Nuovo arrivato
  • *
  • Post: 25
  • Respect: 0
    • Mostra profilo
Re:Tempi di download con AsyncTask
« Risposta #8 il: 03 Agosto 2011, 15:18:01 CEST »
0
grazie adesso ci provo così :)...ma in teoria quando dovrebbe visualizzarsi?, voglio dire a livello di codice a quale riga? lo sai?

Offline denper

  • Utente normale
  • ***
  • Post: 290
  • Respect: +60
    • Mostra profilo
    • Anddenper
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    denper
  • Sistema operativo:
    Window 7, Windows XP
Re:Tempi di download con AsyncTask
« Risposta #9 il: 03 Agosto 2011, 15:23:37 CEST »
0
Quando viene chiamato il metodo execute dell'AsyncTask, viene invocato il metodo onPreExecute() che crea il ProgressDialog, lo inizializza e nella lo visualizza chiamando dialog.show().
Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. [A.Einstein]

Proteggi la tua privacy! Utilizza GhostPhone! https://play.google.com/store/apps/details?id=com.denper.gp
Giochi a Winforlife e Superenalotto e sei stanco di controllare le tue schedine manualmente? Prova Checkwin: https://play.google.com/store/apps/details?id=com.denper.checkwintrial

Offline ienariden

  • Nuovo arrivato
  • *
  • Post: 25
  • Respect: 0
    • Mostra profilo
Re:Tempi di download con AsyncTask
« Risposta #10 il: 03 Agosto 2011, 15:26:08 CEST »
0
tutto questo anche senza aver dichiarato nessun progressdialog nel layout giusto? (scusa se ti faccio ste domande stupide..ma siccome ci sto sbattendo la testa da un pò...)

Offline denper

  • Utente normale
  • ***
  • Post: 290
  • Respect: +60
    • Mostra profilo
    • Anddenper
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    denper
  • Sistema operativo:
    Window 7, Windows XP
Re:Tempi di download con AsyncTask
« Risposta #11 il: 03 Agosto 2011, 15:36:40 CEST »
0
Si, solo da codice.
Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. [A.Einstein]

Proteggi la tua privacy! Utilizza GhostPhone! https://play.google.com/store/apps/details?id=com.denper.gp
Giochi a Winforlife e Superenalotto e sei stanco di controllare le tue schedine manualmente? Prova Checkwin: https://play.google.com/store/apps/details?id=com.denper.checkwintrial