Dbrant has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/338366 )

Change subject: Improve symmetry of setting/nulling callbacks on feed views.
......................................................................

Improve symmetry of setting/nulling callbacks on feed views.

So, here's the thing:
When feed views get destroyed, we need to explicitly null out the
"callback" field that they contain. Otherwise, it's known to cause memory
leak(s) on certain APIs.

So far, we've been using the onViewAttachedToWindow() method to give the
callback to the view, and similarly using onViewDetachedFromWindow() to
set the callback to null, which seems to work well in preventing memory
leaks.

I've noticed, however, that in certain feed views, we have *nested*
RecyclerViews, and in the adapters of those nested RecyclerViews, we don't
actually use the attached/detached-from-window logic for setting and
nulling the callback (instead we just set the callback in onBindViewHolder).

My guess is that the latest version of appcompat has exposed this
inconsistency, in the form of race condition between the parent and nested
RecyclerAdapters in setting the callback.

This patch updates our "child" RecyclerAdapters to follow the same pattern
of setting and nulling the callback based on the attached/detached calls.

Bug: T158347
Change-Id: Ieb5461dbee0627df5252c51c54817627eedcf4a5
---
M 
app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadCardView.java
M app/src/main/java/org/wikipedia/feed/mostread/MostReadCardView.java
M app/src/main/java/org/wikipedia/feed/news/NewsListCardView.java
M app/src/main/java/org/wikipedia/feed/view/HorizontalScrollingListCardView.java
M app/src/main/java/org/wikipedia/feed/view/ListCardRecyclerAdapter.java
5 files changed, 42 insertions(+), 3 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia 
refs/changes/66/338366/1

diff --git 
a/app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadCardView.java
 
b/app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadCardView.java
index 724cd41..1701aaa 100644
--- 
a/app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadCardView.java
+++ 
b/app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadCardView.java
@@ -2,6 +2,7 @@
 
 import android.content.Context;
 import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.annotation.VisibleForTesting;
 import android.view.View;
 
@@ -75,11 +76,14 @@
             super(items);
         }
 
+        @Nullable @Override protected ListCardItemView.Callback callback() {
+            return getCallback();
+        }
+
         @Override
         public void onBindViewHolder(DefaultViewHolder<ListCardItemView> 
holder, int i) {
             BecauseYouReadItemCard card = item(i);
             holder.getView().setHistoryEntry(new 
HistoryEntry(card.pageTitle(), HistoryEntry.SOURCE_FEED_BECAUSE_YOU_READ));
-            holder.getView().setCallback(getCallback());
         }
     }
 }
diff --git 
a/app/src/main/java/org/wikipedia/feed/mostread/MostReadCardView.java 
b/app/src/main/java/org/wikipedia/feed/mostread/MostReadCardView.java
index 40008bf..d4c7be0 100644
--- a/app/src/main/java/org/wikipedia/feed/mostread/MostReadCardView.java
+++ b/app/src/main/java/org/wikipedia/feed/mostread/MostReadCardView.java
@@ -2,6 +2,7 @@
 
 import android.content.Context;
 import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 
 import org.wikipedia.R;
 import org.wikipedia.feed.view.CardHeaderView;
@@ -42,11 +43,14 @@
             super(items);
         }
 
+        @Nullable @Override protected ListCardItemView.Callback callback() {
+            return getCallback();
+        }
+
         @Override
         public void onBindViewHolder(DefaultViewHolder<ListCardItemView> 
holder, int position) {
             MostReadItemCard card = item(position);
             holder.getView().setHistoryEntry(new 
HistoryEntry(card.pageTitle(), HistoryEntry.SOURCE_FEED_MOST_READ));
-            holder.getView().setCallback(getCallback());
         }
     }
 }
diff --git a/app/src/main/java/org/wikipedia/feed/news/NewsListCardView.java 
b/app/src/main/java/org/wikipedia/feed/news/NewsListCardView.java
index b113044..c800659 100644
--- a/app/src/main/java/org/wikipedia/feed/news/NewsListCardView.java
+++ b/app/src/main/java/org/wikipedia/feed/news/NewsListCardView.java
@@ -2,10 +2,12 @@
 
 import android.content.Context;
 import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.view.View;
 
 import org.wikipedia.R;
 import org.wikipedia.feed.view.CardHeaderView;
+import org.wikipedia.feed.view.FeedAdapter;
 import org.wikipedia.feed.view.HorizontalScrollingListCardItemView;
 import org.wikipedia.feed.view.HorizontalScrollingListCardView;
 import org.wikipedia.util.DateUtil;
@@ -46,12 +48,15 @@
             super(items);
         }
 
+        @Nullable @Override protected FeedAdapter.Callback callback() {
+            return getCallback();
+        }
+
         @Override
         public void 
onBindViewHolder(DefaultViewHolder<HorizontalScrollingListCardItemView> holder, 
int i) {
             final NewsItemCard card = item(i);
             holder.getView().setText(card.text());
             holder.getView().setImage(card.image());
-            holder.getView().setCallback(getCallback());
             holder.getView().setOnClickListener(new OnClickListener() {
                 @Override
                 public void onClick(View view) {
diff --git 
a/app/src/main/java/org/wikipedia/feed/view/HorizontalScrollingListCardView.java
 
b/app/src/main/java/org/wikipedia/feed/view/HorizontalScrollingListCardView.java
index 12c554e..84b657e 100644
--- 
a/app/src/main/java/org/wikipedia/feed/view/HorizontalScrollingListCardView.java
+++ 
b/app/src/main/java/org/wikipedia/feed/view/HorizontalScrollingListCardView.java
@@ -2,6 +2,7 @@
 
 import android.content.Context;
 import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
 import android.view.ViewGroup;
@@ -44,9 +45,21 @@
             super(items);
         }
 
+        @Nullable protected abstract FeedAdapter.Callback callback();
+
         @Override public 
DefaultViewHolder<HorizontalScrollingListCardItemView> 
onCreateViewHolder(ViewGroup parent,
                                                                                
          int viewType) {
             return new DefaultViewHolder<>(new 
HorizontalScrollingListCardItemView(parent.getContext()));
         }
+
+        @Override public void 
onViewAttachedToWindow(DefaultViewHolder<HorizontalScrollingListCardItemView> 
holder) {
+            super.onViewAttachedToWindow(holder);
+            holder.getView().setCallback(callback());
+        }
+
+        @Override public void 
onViewDetachedFromWindow(DefaultViewHolder<HorizontalScrollingListCardItemView> 
holder) {
+            holder.getView().setCallback(null);
+            super.onViewDetachedFromWindow(holder);
+        }
     }
 }
diff --git 
a/app/src/main/java/org/wikipedia/feed/view/ListCardRecyclerAdapter.java 
b/app/src/main/java/org/wikipedia/feed/view/ListCardRecyclerAdapter.java
index 83e5a44..a4be1a3 100644
--- a/app/src/main/java/org/wikipedia/feed/view/ListCardRecyclerAdapter.java
+++ b/app/src/main/java/org/wikipedia/feed/view/ListCardRecyclerAdapter.java
@@ -1,6 +1,7 @@
 package org.wikipedia.feed.view;
 
 import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.view.ViewGroup;
 
 import org.wikipedia.views.DefaultRecyclerAdapter;
@@ -14,8 +15,20 @@
         super(items);
     }
 
+    @Nullable protected abstract ListCardItemView.Callback callback();
+
     @Override public DefaultViewHolder<ListCardItemView> 
onCreateViewHolder(ViewGroup parent,
                                                                             
int viewType) {
         return new DefaultViewHolder<>(new 
ListCardItemView(parent.getContext()));
     }
+
+    @Override public void 
onViewAttachedToWindow(DefaultViewHolder<ListCardItemView> holder) {
+        super.onViewAttachedToWindow(holder);
+        holder.getView().setCallback(callback());
+    }
+
+    @Override public void 
onViewDetachedFromWindow(DefaultViewHolder<ListCardItemView> holder) {
+        holder.getView().setCallback(null);
+        super.onViewDetachedFromWindow(holder);
+    }
 }

-- 
To view, visit https://gerrit.wikimedia.org/r/338366
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ieb5461dbee0627df5252c51c54817627eedcf4a5
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Dbrant <dbr...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to