如何在后台从 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);

有关详细信息,请在此处查看:

https://square.github.io/picasso/