pek*_*his 5 android listview caching image
我正在尝试缓存列表视图中包含的Drawable对象:
我在适配器内有以下内容:
private final ImageThreadloader imageloader=new ImageThreadloader();
public View getView(int position, View convertView, ViewGroup parent)
{
View row=convertView;
ViewWrapper wrapper=null;
Activity activity=(Activity)getContext();
RssItem item=getItem(position);
if (row == null) {
LayoutInflater inflater=activity.getLayoutInflater();
row=inflater.inflate(R.layout.row,null);
wrapper=new ViewWrapper(row);
row.setTag(wrapper);
}
else
{
wrapper=(ViewWrapper)row.getTag();
}
wrapper.getTitle().setText(item.getTitle());
String cleaned=item.getDescription().replaceAll("\\<.*?\\>", "");
int Long=cleaned.length();
if (Long<=100)
{
wrapper.getDescription().setText(cleaned);
}
else wrapper.getDescription().setText(cleaned.substring(0, 50)+"...");
String laurl=item.getImageUrl();
if (laurl!="")
{
imageloader.loadImage(laurl, (ImageView)wrapper.getImage());
}
else
{
wrapper.getImage().setImageResource(R.drawable.icon);
}
return row;
}
static class ViewWrapper {
private View base;
private TextView title=null;
private TextView description=null;
private ImageView icono=null;
ViewWrapper (View base) {
this.base=base;
}
public TextView getTitle() {
if (title==null) {
title=(TextView)base.findViewById(R.id.TitleText);
}
return title;
}
public TextView getDescription() {
if (description==null) {
description=(TextView)base.findViewById(R.id.DescriptionText);
}
return description;
}
public ImageView getImage() {
if (icono==null) {
icono=(ImageView)base.findViewById(R.id.ImageIcon);
}
return icono;
}
}
Run Code Online (Sandbox Code Playgroud)
ImageThreadLoad类如下:
public class ImageThreadloader {
public void loadImage(String imageurl,ImageView imageview)
{
DrawableDownLoaderTask imagetask= new DrawableDownLoaderTask(imageview);
imagetask.execute(imageurl);
}
public static Drawable loadImageFromUrl(String url) {
InputStream inputStream;
try {
inputStream = new URL(url).openStream();
} catch (IOException e) {
throw new RuntimeException(e);
}
return Drawable.createFromStream(inputStream, "src");
}
class DrawableDownLoaderTask extends AsyncTask<String, Void, Drawable> {
private String url;
private final WeakReference<ImageView> imageviewreference;
public DrawableDownLoaderTask(ImageView imageview) {
imageviewreference=new WeakReference<ImageView>(imageview);
}
@Override
protected Drawable doInBackground(String... params)
{
url=params[0];
Drawable drawable=loadImageFromUrl(url);
return drawable;
}
@Override
protected void onPostExecute(Drawable drawable)
{
if (isCancelled())
{
drawable=null;
}
if (imageviewreference!=null)
{
ImageView imageview=imageviewreference.get();
if (imageview!=null)
{
imageview.setImageDrawable(drawable);
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
工作得很好但是如果我快速滚动列表视图会有一些延迟.我已经阅读了几个教程,解决方案总是一样的:缓存.
所以我尝试了以下(更改在单独的线程中加载图像的类):
private final HashMap <String, SoftReference <Drawable>> imagecache= new HashMap <String, SoftReference<Drawable>>();
public void loadImage(String imageurl,ImageView imageview)
{
if (imagecache.containsKey(imageurl))
{
SoftReference<Drawable> drawable= imagecache.get(imageurl);
imageview.setImageDrawable(drawable.get());
}
else
{
DrawableDownLoaderTask imagetask= new DrawableDownLoaderTask(imageview);
imagetask.execute(imageurl);
}
}
class DrawableDownLoaderTask extends AsyncTask<String, Void, Drawable> {
private String url;
private final WeakReference<ImageView> imageviewreference;
public DrawableDownLoaderTask(ImageView imageview) {
imageviewreference=new WeakReference<ImageView>(imageview);
}
@Override
protected Drawable doInBackground(String... params)
{
url=params[0];
Drawable drawable=loadImageFromUrl(url);
if (drawable!=null) imagecache.put(url, new SoftReference<Drawable>(drawable));
return drawable;
}
@Override
protected void onPostExecute(Drawable drawable)
{
ImageView imageview=imageviewreference.get();
imageview.setImageDrawable(drawable);
}
}
Run Code Online (Sandbox Code Playgroud)
每一个似乎工作正常,但当我滚动图像开始消失在一些行.有问题?有什么工具可以帮我解决这个问题吗?
提前致谢
首先,让我们看一下这段代码。
SoftReference<Drawable> drawable= imagecache.get(imageurl);
imageview.setImageDrawable(drawable.get());
Run Code Online (Sandbox Code Playgroud)
要点SoftReference是系统可以收集所包含的参考。在这种情况下,它将drawable.get()返回null并且您的图像将消失。
还要检查点火装置- 无论是为了灵感还是为了使用。
| 归档时间: |
|
| 查看次数: |
6682 次 |
| 最近记录: |