gpt4 book ai didi

android - android中线程加载的网页图片

转载 作者:搜寻专家 更新时间:2023-11-01 09:18:17 24 4
gpt4 key购买 nike

我在 ListActivity 中有一个扩展的 BaseAdapter:

private static class RequestAdapter extends BaseAdapter {

以及其中定义的一些handlers和runnables

// Need handler for callbacks to the UI thread
final Handler mHandler = new Handler();

// Create runnable for posting
final Runnable mUpdateResults = new Runnable() {
public void run() {
loadAvatar();
}
};

protected static void loadAvatar() {
// TODO Auto-generated method stub
//ava.setImageBitmap(getImageBitmap("URL"+pic));
buddyIcon.setImageBitmap(avatar);
}

在 Adapter 的 getView 函数中,我得到这样的 View :

if (convertView == null) {
convertView = mInflater.inflate(R.layout.messageitem, null);

// Creates a ViewHolder and store references to the two children views
// we want to bind data to.
holder = new ViewHolder();
holder.username = (TextView) convertView.findViewById(R.id.username);
holder.date = (TextView) convertView.findViewById(R.id.dateValue);
holder.time = (TextView) convertView.findViewById(R.id.timeValue);
holder.notType = (TextView) convertView.findViewById(R.id.notType);
holder.newMsg = (ImageView) convertView.findViewById(R.id.newMsg);
holder.realUsername = (TextView) convertView.findViewById(R.id.realUsername);
holder.replied = (ImageView) convertView.findViewById(R.id.replied);
holder.msgID = (TextView) convertView.findViewById(R.id.msgID_fr);
holder.avatar = (ImageView) convertView.findViewById(R.id.buddyIcon);
holder.msgPreview = (TextView) convertView.findViewById(R.id.msgPreview);


convertView.setTag(holder);
} else {
// Get the ViewHolder back to get fast access to the TextView
// and the ImageView.
holder = (ViewHolder) convertView.getTag();
}

图像以这种方式加载:

Thread sepThread = new Thread() {
public void run() {
String ava;
ava = request[8].replace(".", "_micro.");
Log.e("ava thread",ava+", username: "+request[0]);
avatar = getImageBitmap(URL+ava);
buddyIcon = holder.avatar;
mHandler.post(mUpdateResults);
//holder.avatar.setImageBitmap(getImageBitmap(URL+ava));
}
};
sepThread.start();

现在,我遇到的问题是,如果有更多项目需要显示同一张图片,则并非所有这些图片都会显示。当您上下滚动列表时,您可能最终会填满所有列表。

当我尝试注释掉的行 (holder.avatar.setImageBitmap...) 时,应用程序有时会强制关闭并显示“只有创建 View 的线程可以请求...”。但只是有时。

知道如何解决这个问题吗?两种选择。

最佳答案

调用 getView 时,您将获得头像 ImageView。您应该将此实例传递给 sepThread,而 sepThread 应该将此实例传递给 mUpdateResults。这样,位图将准确显示到为其下载的 ImageView。否则位图显示给某些不正确的 budddyIcon 实例。您的线程正在下载图像一段时间,当它准备好时,budddyIcon 引用另一个 ImageView,因为另一个 getView 已经被调用。

应该看起来像这样:

public View getView(...){
//skip
(new SepThread(holder.avatar)).start();
}

public class SepThread extends Thread() {
ImageView imageView;
public SepThread(ImageVIew iv){
imageView=iv;
}
public void run() {
//skip
Bitmap avatar = getImageBitmap(URL+ava);
mHandler.post(new UpdateResults(imageView, avatar));
}
};

class UpdateResults extends Runnable() {
ImageView imageView;
Bitmap bitmap;
public UpdateResults(ImageView iv, Bitmap b){
imageView=iv;
bitmap=b;
}
public void run() {
loadAvatar(imageView, bitmap);
}
};

protected static void loadAvatar(ImageView iv, Bitmap b) {
iv.setImageBitmap(b);
}

当然,您应该了解回收的 convertViews,正如上面 disretrospect 所说的那样。

我做了一个完整的LazyList例子并贴出源码,可能也有帮助Lazy load of images in ListView .

关于android - android中线程加载的网页图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2957287/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com