我使用以下算法下载和缓存图像。它运作良好。初始加载图像需要时间。我希望显示一个进度指示来显示这一点。我希望进度指示器仅在图像视图中不会阻挡屏幕的其他部分。例如,我有一个列表,每个人都有一个图像和文字。行是可点击的。所以我想显示每行图像的进度指示,直到它被加载。同时文本部分应该是可见的,列表视图应该是可点击的。用户无需等待即可完成加载。他甚至可以在加载该行的图像之前单击一行并打开详细信息页面。
按进度指标,我只是指示图像正在加载。像一些旋转轮。我不是在寻找一个百分比指示或类似的东西。感谢很多
代码
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();
}
}
答案 0 :(得分:1)
使用当前的实现,进度条将无法正常工作,因为整个“加载图像数据并构建可绘制的”是在一行Drawable drawable = Drawable.createFromStream(is, "src");
中完成的。因此,您无法确定加载的百分比。
您可以做的是使用不确定进度指示器(又称旋转轮)。
你可以,例如在图像加载时覆盖图像上的此类ProgressBar视图的实例,并在图像加载完成后立即删除(或隐藏)。