Как загрузить изображение из URL в фоновом режиме и загрузить его в onPostExecute в ImageView - PullRequest
0 голосов
/ 26 марта 2019

Я программирую такое приложение, как Tinder. В своей деятельности я инициализирую массив, содержащий все возможные совпадения. И затем в моем адаптере я использовал для загрузки изображения профиля от пользователя в ImageView с glide.with (context) .load (url) .into (ImageView), это также работает отлично, однако мой onClickListener в моем адаптере не работает. Очевидно, проблема в том, что основной поток «заморожен», потому что у него слишком много работы для загрузки изображений в режиме просмотра изображений. Из-за этого я реализовал AsyncTask, где я загружаю изображение в фоновом режиме и в onPostExecute я загружаю его в ImageView. Это также работает, однако, когда я проводил 4/5 пользователей, внезапно изображение от другого пользователя отображается для неправильного пользователя, и если я подожду несколько секунд, ImageView каким-то образом «обновится» и появится правильный ImageView.

Я понятия не имею, почему у меня такое поведение, и я подумал, что, возможно, загрузка изображений с растровым изображением слишком медленная, и если бы я мог загрузить изображение из Интернета в фоновом режиме и загрузить его с помощью glide в 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 голосов
/ 27 марта 2019

Вместо того, чтобы иметь дело с AsyncTasks, вы можете просто использовать библиотеку Picasso, дать URL-адрес изображения и изображение, которое вы хотите, и оно сделает волшебство.

Picasso.get (). Нагрузка ( "http://i.imgur.com/DvpvklR.png").into(imageView);

Подробнее см. Здесь:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...