如何在后台从url下载图像并将其加载到ImageView的onPostExecute中

时间:2019-03-26 20:57:24

标签: android android-asynctask android-glide

我正在编写Tinder之类的应用。在我的活动中,我初始化了一个包含所有可能匹配项的arraylist。然后,在我的适配器中,我曾经使用glide.with(context).load(url).into(ImageView)从ImageView中的用户中加载配置文件图像,这也可以很好地工作,但是适配器中的onClickListener无法正常工作。显然问题在于主线程是“冻结的”,因为他的工作量很大,无法将图像加载到图像视图中。 因此,我实现了一个AsyncTask,在其中我在后台下载了图像,并在onPostExecute中将其加载到了ImageView中。这也可行,但是当我刷4/5个用户时,突然为错误的用户显示了另一个用户的图像,如果我等了几秒钟,ImageView就会以某种方式“更新”并显示正确的ImageView。

我不知道为什么会有这种行为,我认为也许用位图加载图像太慢了,如果我可以在后台从Web上下载图像并在onPostExecute中滑行加载它,是否可以工作?如果有人有想法,我将不胜感激!


    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);
            }
    }



}




1 个答案:

答案 0 :(得分:0)

您可以只使用Picasso库,而不必使用AsyncTasks,而是提供所需的图像url和imageView即可。

Picasso.get()。load(“ http://i.imgur.com/DvpvklR.png”)。into(imageView);

有关详细信息,请点击此处

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