2016-04-21 1 views
2

У меня есть RecyclerView с его Adapter в Fragment. В настоящее время я ищу причины для OOM, и Context утечка может быть одной из причин.Android - Лучший подход для передачи контекста в адаптере (в частности, `RecyclerViewAdapter`)

Есть несколько подходов, которые я сделал в получении контекста в Adapter (нужно для ContextSharedPreferences, Glide/Picasso и замены Fragments).

  1. Передача Context через конструктор адаптера, а затем установить его в глобальную переменную внутри адаптера:

    LobbyAdapter lobbyAdapter = new LobbyAdapter(this.getActivity);

  2. имеют в Adapter глобальную Context и взять Context из onCreateViewHolder:

    context = parent.getContext(); Это вызывает проблемы, когда я new Адаптер с использованием SwipeRefreshLayout. Но это должно быть из-за ошибочной логики, которую я сделал в Fragment, все еще отслеживая это.

  3. Не сделать глобальную переменную Context, но получить каждый Context из View от каждого ViewHolder связанных с Context

Loading an image

The key here is using the holder to get the Context ((FriendProfileViewHolder) holder).coverPhoto.getContext()

Glide.with(((FriendProfileViewHolder) holder).coverPhoto.getContext()) 
.load(utilities.webAddress + profileDataModel.user_cover_image_path) 
.diskCacheStrategy(DiskCacheStrategy.ALL) 
.skipMemoryCache(true) 
.centerCrop() 
.into(((FriendProfileViewHolder) holder).coverPhoto); 

В эта часть, из-за моего отсутствия f Context, я не уверен, какой вид мы должны получить Context, если один метод повторно используется разными Views .

Дополнительный вопрос: (Это, возможно, потребуется новый вопрос нить ..)

В нескольких Adapters, я делаю AsyncTask, чтобы получить ответ от сервера, чтобы изменить изображение. И мне нужно Context в Interface, чтобы сделать getPackageName(), чтобы получить пакет приложения, и getResources() для доступа к ресурсам.

String pictureName = output.image_name_profile; 
String packageName = context.getPackageName(); 

if(!pictureName.equals("default")){ 
    resId = context.getResources().getIdentifier("drawable/" + pictureName, null, packageName); 
    image = context.getResources().getDrawable(resId); 
     } 

Возможно, мне нужно создать глобальную переменную и метод для изменения этих значений?

ответ

0

Я использовал первый подход, который вы описали в своем вопросе, тот, который передает Context через конструктор, а затем устанавливает его в глобальную переменную для последующего использования. Этот подход отлично подходит для фрагментов, содержащих RecyclerViews. Использовал его несколько раз, и он никогда не вызывал проблемы с утечкой Контекста.

Я не использовал ни один из других подходов, поэтому не буду комментировать их.

+0

Хм .. Поэтому у вас никогда не было проблем с утечкой. У меня есть Activity, который содержит множество фрагментов, если я продолжаю делать 'this.getActivity()' на каждом фрагменте, чтобы передать контекст, это должно быть хорошо тогда? –

+0

Да, все будет хорошо. Контекстных утечек не будет. –

+0

Это другой вопрос, так .. Как вы управляете памятью для «Фрагмента», который динамически получает контент с сервера? Например, приложения для социальных сетей, я продолжаю получать содержимое и продолжаю занимать пространство в памяти даже после перехода на другой фрагмент. –