0

画像のダウンロードとキャッシュに以下のアルゴリズムを使用しています。それはうまくいっています。イメージの初期読み込みには、予想どおり時間がかかります。これを示すために進行状況を表示したい。画面の他の部分をブロックせずに、画像ビューにのみ進行状況インジケーターが表示されるようにします。たとえば、各行に画像とテキストが含まれるリストがあります。行はクリック可能です。そのため、各行の画像が読み込まれるまで進行状況を表示したいと考えています。同時に、テキスト部分が表示され、リスト ビューがクリック可能になるはずです。ユーザーは読み込みが完了するまで待つ必要はありません。行の画像がロードされる前でも、行をクリックして詳細ページを開くことができるはずです。

進行状況インジケーターとは、画像が読み込まれていることを示すだけです。糸車のように。私はパーセンテージ表示などを探しているわけではありません。

コード

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

}
4

1 に答える 1

1

現在の実装では、「画像データのロードとドローアブルの構築」全体が1行で行われるため、プログレスバーはうまく機能しませんDrawable drawable = Drawable.createFromStream(is, "src");。したがって、ロードの何パーセントが実行されたかを判断する方法はありません。

できることは、不確定な進行状況インジケーター(別名スピニングホイール)を使用することです。

たとえば、そのようなProgressBarビューのインスタンスを画像の読み込み中にオーバーレイし、画像の読み込みが完了するとすぐに削除(または非表示)することができます。

于 2012-11-05T07:24:07.920 に答える