У меня есть RecyclerView
с его Adapter
в Fragment
. В настоящее время я ищу причины для OOM, и Context
утечка может быть одной из причин.Android - Лучший подход для передачи контекста в адаптере (в частности, `RecyclerViewAdapter`)
Есть несколько подходов, которые я сделал в получении контекста в Adapter
(нужно для Context
SharedPreferences
, Glide
/Picasso
и замены Fragments
).
Передача
Context
через конструктор адаптера, а затем установить его в глобальную переменную внутри адаптера:LobbyAdapter lobbyAdapter = new LobbyAdapter(this.getActivity);
имеют в
Adapter
глобальнуюContext
и взятьContext
изonCreateViewHolder
:context = parent.getContext();
Это вызывает проблемы, когда яnew
Адаптер с использованиемSwipeRefreshLayout
. Но это должно быть из-за ошибочной логики, которую я сделал вFragment
, все еще отслеживая это.Не сделать глобальную переменную
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);
}
Возможно, мне нужно создать глобальную переменную и метод для изменения этих значений?
Хм .. Поэтому у вас никогда не было проблем с утечкой. У меня есть Activity, который содержит множество фрагментов, если я продолжаю делать 'this.getActivity()' на каждом фрагменте, чтобы передать контекст, это должно быть хорошо тогда? –
Да, все будет хорошо. Контекстных утечек не будет. –
Это другой вопрос, так .. Как вы управляете памятью для «Фрагмента», который динамически получает контент с сервера? Например, приложения для социальных сетей, я продолжаю получать содержимое и продолжаю занимать пространство в памяти даже после перехода на другой фрагмент. –