Android: индикатор прогресса загрузки изображения

Я использую приведенный ниже алгоритм для загрузки и кэширования изображений. Это работает хорошо. Первоначальная загрузка изображения занимает некоторое время, как и ожидалось. Я хочу показать индикатор прогресса, чтобы показать это. Я хочу, чтобы индикатор прогресса появлялся только в представлении изображения, не блокируя другие части экрана. Например, у меня есть список, в котором каждая строка имеет изображение и текст. Строки кликабельны. Итак, я хочу показать индикацию прогресса для изображения каждой строки, пока она не будет загружена. При этом текстовая часть должна быть видна, а представление списка должно быть кликабельным. Пользователю не нужно ждать окончания загрузки. Он должен иметь возможность щелкнуть строку и открыть страницу сведений еще до того, как будет загружено изображение для этой строки.

под индикатором прогресса я имею в виду просто указание на то, что изображение загружается. как какая-то прялка. я не ищу указание процента или что-то в этом роде.

код

    package com.idg.reelbillboard.utils;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.Map;

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.ImageView;

public class DrawableManager {
    private final Map<String, Drawable> drawableMap;

    public DrawableManager() {
        drawableMap = new HashMap<String, Drawable>();
    }

    public Drawable fetchDrawable(String urlString) {
        if (drawableMap.containsKey(urlString)) {
            return drawableMap.get(urlString);
        }

        Log.d(this.getClass().getSimpleName(), "image url:" + urlString);
        try {
            InputStream is = fetch(urlString);
            Drawable drawable = Drawable.createFromStream(is, "src");


            if (drawable != null) {
                drawableMap.put(urlString, drawable);
                Log.d(this.getClass().getSimpleName(), "got a thumbnail drawable: " + drawable.getBounds() + ", "
                        + drawable.getIntrinsicHeight() + "," + drawable.getIntrinsicWidth() + ", "
                        + drawable.getMinimumHeight() + "," + drawable.getMinimumWidth());
            } else {
              Log.w(this.getClass().getSimpleName(), "could not get thumbnail");
            }

            return drawable;
        } catch (MalformedURLException e) {
            Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
            return null;
        } catch (IOException e) {
            Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
            return null;
        }
    }

    public void fetchDrawableOnThread(final String urlString, final ImageView imageView, Context context) {
        if (drawableMap.containsKey(urlString)) {
            imageView.setImageDrawable(drawableMap.get(urlString));
        }
      //  final ProgressDialog progressDialog = ProgressDialog.show(context, "", "Loading", false); 
        final Handler handler = new Handler() {
            @Override
            public void handleMessage(Message message) {
            //   if(progressDialog.isShowing()) 
            //         progressDialog.dismiss(); 
                imageView.setImageDrawable((Drawable) message.obj);
            }
        };

        Thread thread = new Thread() {
            @Override
            public void run() {
                //TODO : set imageView to a "pending" image

                Drawable drawable = fetchDrawable(urlString);
                Message message = handler.obtainMessage(1, drawable);
                handler.sendMessage(message);

            }
        };
        thread.start();
    }

    private InputStream fetch(String urlString) throws MalformedURLException, IOException {
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpGet request = new HttpGet(urlString);
        HttpResponse response = httpClient.execute(request);
        return response.getEntity().getContent();
    }

}

person png    schedule 05.11.2012    source источник


Ответы (1)


С вашей текущей реализацией индикатор выполнения не будет работать должным образом, так как все «загрузить данные изображения и построить рисуемый объект» выполняется в одной строке Drawable drawable = Drawable.createFromStream(is, "src");. Таким образом, у вас нет возможности определить, сколько процентов загрузки сделано.

Что вы можете сделать, так это использовать индикатор неопределенного прогресса (также известный как вращающееся колесо).

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

person Ridcully    schedule 05.11.2012
comment
Это именно то, что я ищу. Есть ли пример этого - person png; 05.11.2012
comment
Если это одно изображение в макете, просто добавьте в макет объект ProgressBar, который перекрывает изображение (используя RelativeLayout, это довольно просто). Сделайте ProgressBar невидимым или исчезнувшим по умолчанию. Затем, когда вы начнете загружать изображение, установите его видимость на видимый и верните его на невидимый, когда вы закончите загрузку. - person Ridcully; 05.11.2012