Пикассо и контекст

Я играл в последнее время с Picasso в качестве библиотеки загрузчика изображений. Я использую его совместно с Dagger и OkHtttp.

Мои вопросы, касающиеся этой библиотеки, - это использование контекста и создание библиотеки через конструктор.

Я не совсем уверен, что это за контекст (не могу найти документацию об этом), а также какой контекст мы должны использовать (ApplicationContext или ActivityContext?) и почему.

Глядя на примеры (отличное приложение для примера, чтобы увидеть все это в сочетании) u2020 от Jake Wharton, только один экземпляр Picasso создан с использованием контекста приложения. Что-то вроде этого:

@Provides
    @Singleton
    Picasso providePicasso(@ApplicationContext Context context, OkHttpClient client) {
        Picasso picasso = new Picasso.Builder(context)
                .downloader(new OkHttpDownloader(client))
                .listener(new Picasso.Listener() {
                    @Override
                    public void onImageLoadFailed(Picasso picasso, Uri uri, Exception e) {
                        Log.e("Picasso", "Failed to load image:" + uri);
                    }
                })
                .build();

        return picasso;
    } 

Это используется как глобальный объект и создается только один раз. Мой вопрос заключается в том, почему бы не создать экземпляр нового экземпляра picasso на уровне Activity (с тем же глобальным OkHttpClient, который настраивает LRUCache, и он вводится ранее) и передавая активность как контекст? Я читал сегодня утром в потоке Гитуба Пикассо, что нужно использовать контекст приложения, но больше не рассказывал об этом.

Итак, мой вывод: - Каков контекст, используемый и который мы должны использовать. - Зачем использовать глобальный объект, а не экземпляр уровня активности.

Спасибо!

Ответ 1

Неважно, что вы выбираете, при использовании метода Picasso.with(Context) по умолчанию или Builder он будет извлекать приложение Context из заданного Context:

/** Start building a new {@link Picasso} instance. */
public Builder(Context context) {
  if (context == null) {
    throw new IllegalArgumentException("Context must not be null.");
  }
  this.context = context.getApplicationContext();
}

Stub скопирован из Picasso.java # Builder.


Если вы действительно хотите создать новый экземпляр в каждом действии: Для каждого экземпляра Picasso, который вы создаете, вы в основном создаете новый кеш: изображения, кэшированные в первом экземпляре, не будут повторно использоваться во втором экземпляре. Вы, скорее всего, столкнетесь с OutOfMemoryException здесь, поскольку Picasso не справляется с этим.