如何在后台从 url 下载图像并将其加载到 ImageView 的 onPostExecute 中
How to download image from url in background and load it in onPostExecute in ImageView
我正在编写类似 Tinder 的应用程序。在我的 activity 中,我初始化了一个包含所有可能匹配项的数组列表。然后在我的适配器中,我曾经使用 glide.with(context).load(url).into(ImageView) 从 ImageView 中的用户加载个人资料图像,这也很完美,但是我的 onClickListener 在我的适配器不工作。显然问题是主线程是 "frozen" 因为他有太多的工作要做,将图像加载到图像视图中。
因此,我实现了一个 AsyncTask,我在后台下载图像,并在 onPostExecute 中将它加载到 ImageView 中。这也有效,但是当我滑动 4/5 用户时,突然为错误的用户显示了来自另一个用户的图像,如果我等待几秒钟,ImageView 不知何故 "updated" 并且出现正确的 ImageView。
我不知道为什么我有这种行为,我想也许用位图加载图像太慢了,如果我可以在后台从网络上下载图像并在 onPostExecute 中使用 glide 加载它,它会起作用吗?如果有人有想法,我将不胜感激!
private List<cards> listItems;
private Context context;
public arrayAdapter(List<cards> listItems ,Context context){
this.listItems = listItems;
this.context = context;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
return new ViewHolder(v);
}
@SuppressLint("SetTextI18n")
@Override
public void onBindViewHolder(@NonNull final ViewHolder viewHolder, int i) {
final cards currentItem = listItems.get(i);
viewHolder.name.setText(currentItem.getName());
viewHolder.comment.setText(currentItem.getComment());
Picasso.get().load(currentItem.getProfileImageUrl()).into(viewHolder.image);
viewHolder.image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!currentItem.getProfileImageUrl2().equals("default")){
Picasso.get().load(currentItem.getProfileImageUrl2()).into(viewHolder.image);
}
}
});
}
@Override
public int getItemCount() {
return listItems.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
TextView name, comment;
public ImageView image;
private CardView card;
private String imageUrl;
ViewHolder(@NonNull View itemView) {
super(itemView);
name = (TextView) itemView.findViewById(R.id.name);
image = (ImageView) itemView.findViewById(R.id.image);
comment = (TextView) itemView.findViewById(R.id.commentText);
card = (CardView) itemView.findViewById(R.id.card);
}
}
}
除了处理 AsyncTasks,您可以只使用 Picasso 库,提供图像 url 和您想要的 imageView,它会发挥作用。
Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(imageView);
有关详细信息,请在此处查看:
我正在编写类似 Tinder 的应用程序。在我的 activity 中,我初始化了一个包含所有可能匹配项的数组列表。然后在我的适配器中,我曾经使用 glide.with(context).load(url).into(ImageView) 从 ImageView 中的用户加载个人资料图像,这也很完美,但是我的 onClickListener 在我的适配器不工作。显然问题是主线程是 "frozen" 因为他有太多的工作要做,将图像加载到图像视图中。 因此,我实现了一个 AsyncTask,我在后台下载图像,并在 onPostExecute 中将它加载到 ImageView 中。这也有效,但是当我滑动 4/5 用户时,突然为错误的用户显示了来自另一个用户的图像,如果我等待几秒钟,ImageView 不知何故 "updated" 并且出现正确的 ImageView。
我不知道为什么我有这种行为,我想也许用位图加载图像太慢了,如果我可以在后台从网络上下载图像并在 onPostExecute 中使用 glide 加载它,它会起作用吗?如果有人有想法,我将不胜感激!
private List<cards> listItems;
private Context context;
public arrayAdapter(List<cards> listItems ,Context context){
this.listItems = listItems;
this.context = context;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
return new ViewHolder(v);
}
@SuppressLint("SetTextI18n")
@Override
public void onBindViewHolder(@NonNull final ViewHolder viewHolder, int i) {
final cards currentItem = listItems.get(i);
viewHolder.name.setText(currentItem.getName());
viewHolder.comment.setText(currentItem.getComment());
Picasso.get().load(currentItem.getProfileImageUrl()).into(viewHolder.image);
viewHolder.image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!currentItem.getProfileImageUrl2().equals("default")){
Picasso.get().load(currentItem.getProfileImageUrl2()).into(viewHolder.image);
}
}
});
}
@Override
public int getItemCount() {
return listItems.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
TextView name, comment;
public ImageView image;
private CardView card;
private String imageUrl;
ViewHolder(@NonNull View itemView) {
super(itemView);
name = (TextView) itemView.findViewById(R.id.name);
image = (ImageView) itemView.findViewById(R.id.image);
comment = (TextView) itemView.findViewById(R.id.commentText);
card = (CardView) itemView.findViewById(R.id.card);
}
}
}
除了处理 AsyncTasks,您可以只使用 Picasso 库,提供图像 url 和您想要的 imageView,它会发挥作用。
Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(imageView);
有关详细信息,请在此处查看: