Подтвердить что ты не робот

Обратный вызов загрузки изображения Picasso

Я хочу использовать Picasso для загрузки трех последовательных изображений один поверх другого в виде списка. Использование методов, предлагаемых Picasso, делает это проще. Однако, поскольку эти изображения загружаются в разное время, это вызывает мерцающий эффект по мере поступления изображений. Например, иногда изображение 2 появляется перед изображением 1, а при загрузке изображения 1 вызывает неестественное заикание. Было бы лучше, если бы я мог установить видимость списка на невидимую, пока все изображения не будут доступны для отображения. Однако для Picasso не существует метода обратного вызова, который бы сигнализировал, когда изображение было загружено.

Кто-нибудь знает о решении для такого рода ситуаций, используя Picasso?

Спасибо

4b9b3361

Ответ 1

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

Javadoc: https://square.github.io/picasso/2.x/picasso/com/squareup/picasso/RequestCreator.html#into-android.widget.ImageView-com.squareup.picasso.Callback-

Ответ 2

Вот простой пример, как воспрепятствовать обратному вызову при загрузке изображений Пикассо:

Picasso.with(MainActivity.this)
            .load(imageUrl)
            .into(imageView, new com.squareup.picasso.Callback() {
                        @Override
                        public void onSuccess() {
                            //do smth when picture is loaded successfully

                        }

                        @Override
                        public void onError() {
                            //do smth when there is picture loading error
                        }
                    });

В последней версии Picasso onError получает исключение в качестве параметра и использует get() вместо with()

Picasso.get()
            .load(imageUrl)
            .into(imageView, new com.squareup.picasso.Callback() {
                        @Override
                        public void onSuccess() {
                            //do smth when picture is loaded successfully

                        }

                        @Override
                        public void onError(Exception ex) {
                            //do smth when there is picture loading error
                        }
                    });

Ответ 3

Вы можете реализовать обратный вызов с помощью Picasso, как показано ниже:

ImageHandler.getSharedInstance(getApplicationContext()).load(imString).skipMemoryCache().resize(width, height).into(image, new Callback() {
            @Override
            public void onSuccess() {
                layout.setVisibility(View.VISIBLE);
            }

            @Override
            public void onError() {

            }
        });
}

Реализация моего класса ImageHandler показана ниже:

public class ImageHandler {

    private static Picasso instance;

    public static Picasso getSharedInstance(Context context)
    {
        if(instance == null)
        {
            instance = new Picasso.Builder(context).executor(Executors.newSingleThreadExecutor()).memoryCache(Cache.NONE).indicatorsEnabled(true).build();
        }
        return instance;
    }
}

Ответ 4

Это загрузка изображения URL в просмотр изображений с простыми обратными вызовами Пикассо

           Picasso.with(this)
            .load(Picurl)
            .into(Imageview, new Callback() {
                        @Override
                        public void onSuccess() {

                        }

                        @Override
                        public void onError() {


                        }
                    }
            );

И это загрузка изображений Пикассо с большим количеством обратных вызовов

private void loadImage() {
    Picasso.with(this)
            .load(PicURL)
            .into(mContentTarget);
  }


private Target mContentTarget = new Target() {
    @Override
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
    Imageview.setImageBitmap(bitmap);
    }

    @Override
    public void onBitmapFailed(Drawable errorDrawable) {
    }

    @Override
    public void onPrepareLoad(Drawable placeHolderDrawable) {
    }
};

Ответ 5

Вы можете использовать объект Target. Как только target1 получает обратный вызов, вы можете загрузить второй актив, затем получить обратный вызов в target2, а затем запустить третью загрузку.