Обновление диалогового окна прогресса - PullRequest
3 голосов
/ 02 апреля 2011

Я пытаюсь создать приложение, которое поможет мне оценить время загрузки файла с веб-ресурса.Я нашел 2 образца:

Скачать файл с Android и показать прогресс в ProgressDialog

и

http://www.helloandroid.com/tutorials/how-download-fileimage-url-your-device

Второй пример показывает меньшее время загрузки, но я не могу понять, как обновить диалог прогресса, используя его.Я думаю, что что-то должно быть сделано с выражением "while" во втором случае, но я не могу найти что.Может ли кто-нибудь дать мне какой-нибудь совет?

UPD:

1-й код:

try {
            time1 = System.currentTimeMillis();
            URL url = new URL(path);
            URLConnection conexion = url.openConnection();
            conexion.connect();
            // this will be useful so that you can show a tipical 0-100% progress bar
            int lenghtOfFile = conexion.getContentLength();
            // downlod the file
            InputStream input = new BufferedInputStream(url.openStream());
            OutputStream output = new FileOutputStream("/sdcard/analyzer/test.jpg");

            byte data[] = new byte[1024];

            long total = 0;

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


        } catch (Exception e) {}

        timetaken = System.currentTimeMillis() - time1;

2-й код:

       long time1 = System.currentTimeMillis();
        DownloadFromUrl(path, "test.jpg");
        long timetaken = System.currentTimeMillis() - time1;

Где

  public void DownloadFromUrl(String imageURL, String fileName) {  //this is the downloader method
 try {
         URL url = new URL(imageURL); //you can write here any link
         File file = new File(fileName);

        /*Open a connection to that URL. */
         URLConnection ucon = url.openConnection();

         /*
          * Define InputStreams to read from the URLConnection.
          */
         InputStream is = ucon.getInputStream();
         BufferedInputStream bis = new BufferedInputStream(is);

         /*
          * Read bytes to the Buffer until there is nothing more to read(-1).
          */
         ByteArrayBuffer baf = new ByteArrayBuffer(50);
         int current = 0;
         while ((current = bis.read()) != -1) {
                 baf.append((byte) current);
         }

         /* Convert the Bytes read to a String. */
         FileOutputStream fos = new FileOutputStream(PATH+file);
         fos.write(baf.toByteArray());
         fos.close();

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

Итак, первый метод кажется медленнее примерно на 30%.

Ответы [ 2 ]

2 голосов
/ 02 апреля 2011

Второй пример может работать быстрее, но он монополизирует поток GUI. первый подход с использованием AsyncTask лучше;это позволяет графическому интерфейсу оставаться отзывчивым в процессе загрузки.

Я считаю полезным сравнить AsyncTask с SwingWorker, как показано в этом пример .

1 голос
/ 02 апреля 2011

первая ссылка самая лучшая.Но я не могу предоставить код (это домашний комп) в понедельник или позже, я могу предоставить полную функцию.Но:

private class DownloadFile extends AsyncTask<String, Integer, String>{
    @Override
    protected String doInBackground(String... url) {
        int count;
        try {
            URL url = new URL(url[0]);
            URLConnection conexion = url.openConnection();
            conexion.connect();
            // this will be useful so that you can show a tipical 0-100% progress bar
            int lenghtOfFile = conexion.getContentLength();

            // downlod the file
            InputStream input = new BufferedInputStream(url.openStream());
            OutputStream output = new FileOutputStream("/sdcard/somewhere/nameofthefile.ext");

            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;
    }

этот класс лучше для него (imho).publishProgress это простая функция, где у вас есть максимум две строки.Установите максимум и установите ток.Как вы можете видеть в этом коде lenghtOfFile это сколько байтов имеет ваш файл.total - текущий прогресс (пример 25 из 100 байт).Запустите этот класс легко: DownloadFile a = new DownloadFile(); a.execute(value,value);//or null if u not using value. Надеюсь, вы понимаете меня, я не очень хорошо говорю по-английски.

...