Избегайте перезагрузки изображений из Firebase с помощью Recycleview - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть вид корзины, который загружает разные изображения, хранящиеся в Firebase Storage. Когда я прокручиваю свой режим повторного просмотра, он загружает одни и те же изображения каждый раз (точно так же, как в соответствии с определением режима повторного просмотра).

Как загрузить эти изображения один раз и прикрепить к своему виду повторного просмотра, чтобы они не перезагружались при прокрутке ?

Я пробовал вот так.

public void onBindViewHolder(final TodaysBdayViewHolder holder, int position)
{
           storageReference=FirebaseStorage.getInstance().getReference().child("profiles/"+contacts.get(position)+".jpg");

            final File localFile=File.createTempFile("profile_pic","jpeg",new File(context.getExternalFilesDir("null").getAbsolutePath()));

            storageReference.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
                public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {

                    Log.i("app","FinishIntro Img loaded");
                    Bitmap bitmap= BitmapFactory.decodeFile(localFile.getAbsolutePath());
                    holder.FriendPhoto.setImageBitmap(bitmap);
                }
            }).addOnFailureListener(new OnFailureListener() {

                public void onFailure(@NonNull Exception e) {

                }
            });
}

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

вы можете использовать glide для кэширования изображения и показывать его при просмотре изображения

public void onBindViewHolder(final TodaysBdayViewHolder holder, int position)
{
    storageReference = FirebaseStorage.getInstance().getReference().child("profiles/"+contacts.get(position)+".jpg");
    // get the download URL
    storageReference.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
        public void onSuccess(Uri uri) {
            // load and cache with glide
            Glide.with(context)
                .load(uri)
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(holder.FriendPhoto);
        }
    }).addOnFailureListener(new OnFailureListener() {

        public void onFailure(@NonNull Exception e) {

        }
    });
}

кеш документации

0 голосов
/ 22 апреля 2020

Вы самостоятельно декодируете растровое изображение из файла, что не очень эффективно. Вместо этого я бы рекомендовал использовать библиотеку, которая предназначена для эффективного выполнения таких вещей, как Пикассо или Glide .

Подход Пикассо:

Добавить в gradle:

implementation 'com.squareup.picasso:picasso:2.71828'

И сделать это при загрузке:

//the file  
final File localFile=File.createTempFile("profile_pic","jpeg",new File(context.getExternalFilesDir("null").getAbsolutePath()));


//the reference
storageReference=FirebaseStorage.getInstance().getReference().child("profiles/"+contacts.get(position)+".jpg");

//the call
storageReference.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
    @Override
    public void onSuccess(Uri uri) {
    // use this uri in picasso call into imageview
Picasso.get().load(uri.toString()).into(holder.FriendPhoto);

    }
}).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception exception) {
        // Handle any errors
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...