Как показать предварительный просмотр изображения при его загрузке на Android?

Я хочу написать приложение, которое отображает изображения с веб-сервера Cherokee. Я загружаю изображения со следующим кодом:

@Override
protected Bitmap doInBackground(URL... params) { 
    URL urlToDownload = params[0];
    String downloadFileName = urlToDownload.getFile();
    downloadFile = new File(applicationContext.getCacheDir(), downloadFileName);
    new File(downloadFile.getParent()).mkdirs(); // create all necessary folders

    // download the file if it is not already cached
    if (!downloadFile.exists()) {
        try {
            URLConnection cn = urlToDownload.openConnection();   
            cn.connect();
            cn.setReadTimeout(5000);
            cn.setConnectTimeout(5000);
            InputStream stream = cn.getInputStream();

            FileOutputStream out = new FileOutputStream(downloadFile);   
            byte buf[] = new byte[16384];
            int numread = 0;
            do {
                numread = stream.read(buf);   
                if (numread <= 0) break;   
                out.write(buf, 0, numread);
            } while (numread > 0);
            out.close();
        } catch (FileNotFoundException e) {
            MLog.e(e);
        } catch (IOException e) {
            MLog.e(e);
        } catch (Exception e) {
            MLog.e(e);
        }
    }

    if (downloadFile.exists()) {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = 16;
        return BitmapFactory.decodeFile(downloadFile.getAbsolutePath(), options);   
    } else {
        return null;
    }
}

Это работает, но поскольку изображения, которые мне нужно загрузить, довольно большие (несколько мегабайт), требуется некоторое время, прежде чем пользователь сможет что-либо увидеть.

Я хочу показать предварительный просмотр изображения с низким разрешением при загрузке полного изображения (как это делает любой веб-браузер). Как я могу это сделать? BitmapFactory, кажется, принимает только полностью загруженные файлы или потоки, которые также полностью загружаются перед декодированием.

На Сервере только изображения высокого разрешения. Я просто хочу показать все изображение, которое я уже загрузил во время загрузки, чтобы показать (части) изображение до того, как оно будет полностью загружено. Таким образом, пользователь может прервать загрузку, как только увидит, что это не та картинка, которую он искал.


person hin    schedule 23.02.2013    source источник


Ответы (2)


Что ж, самый простой способ сделать это — просто загрузить два изображения. Тот, который маленький (скажем, несколько байтов), а затем масштабируете его (это будет выглядеть ужасно, но даст представление о прогрессе) при загрузке большего изображения в фоновом режиме. Более чем вероятно, что маленькое вернется первым, и вы сможете создать впечатление, будто оно переходит из низкого разрешения в высокое.

person Greg Giacovelli    schedule 23.02.2013
comment
К сожалению, я не могу внести какие-либо изменения в сервер. - person hin; 23.02.2013
comment
Android поддерживает прогрессивный jpeg, но не уверен, что вы можете заставить декодер декодировать частичные фрагменты. Наиболее вероятным способом было бы сохранить исходное изображение в файл, в то время как после успешной записи () вы пытаетесь выполнить и асинхронное чтение. Таким образом, если это прогрессивный JPEG, вы можете получить частичное декодирование. Однако, поскольку вы не можете изменить серверный компонент, скорее всего, какой бы сайт вы ни чистили, он не обслуживает прогрессивный JPEG. Вероятно, лучше показать индикатор прогресса, который заполняет - person Greg Giacovelli; 28.02.2013

А как насчет 2 AsyncTask? Первый загружает маленькое изображение или изображение с низким разрешением и отображает его в ImageView, после чего первый AsyncTask вызывает второй AsyncTask, который загружает изображение с полным разрешением.

person Nantaphop    schedule 24.02.2013
comment
К сожалению, я не могу внести какие-либо изменения в сервер. На этом сервере нет образа маленького размера. Я просто хочу показать все, что уже скачано из картинки во время загрузки. Как и любой веб-браузер, когда вы открываете большое изображение. - person hin; 24.02.2013