diff options
| author | Samuel Tardieu <sam@rfc1149.net> | 2015-01-16 13:38:06 +0100 |
|---|---|---|
| committer | Samuel Tardieu <sam@rfc1149.net> | 2015-01-16 13:40:02 +0100 |
| commit | 2908ba721fcc297b6947cf3f4c758d536ad1034b (patch) | |
| tree | ba4bbf61622ef1461d889cb67d50d7a18d85430b /main/src | |
| parent | 59927ca5ecf68ed8fc5a5f9be6e60b2eb4003c47 (diff) | |
| download | cgeo-2908ba721fcc297b6947cf3f4c758d536ad1034b.zip cgeo-2908ba721fcc297b6947cf3f4c758d536ad1034b.tar.gz cgeo-2908ba721fcc297b6947cf3f4c758d536ad1034b.tar.bz2 | |
fix #4619: ANR when loading direction images for basic member
There is no need to preload direction images from the parsing, they will
be loaded asynchronously in the list adapter instead.
Diffstat (limited to 'main/src')
| -rw-r--r-- | main/src/cgeo/geocaching/connector/gc/GCParser.java | 11 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/ui/CacheListAdapter.java | 18 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/ui/DirectionImage.java | 10 |
3 files changed, 21 insertions, 18 deletions
diff --git a/main/src/cgeo/geocaching/connector/gc/GCParser.java b/main/src/cgeo/geocaching/connector/gc/GCParser.java index 5c03dd7..f20df8d 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCParser.java +++ b/main/src/cgeo/geocaching/connector/gc/GCParser.java @@ -28,7 +28,6 @@ import cgeo.geocaching.location.Geopoint; import cgeo.geocaching.network.Network; import cgeo.geocaching.network.Parameters; import cgeo.geocaching.settings.Settings; -import cgeo.geocaching.ui.DirectionImage; import cgeo.geocaching.utils.CancellableHandler; import cgeo.geocaching.utils.HtmlUtils; import cgeo.geocaching.utils.JsonUtils; @@ -343,16 +342,6 @@ public abstract class GCParser { } } - // get direction images - if (Settings.getLoadDirImg()) { - final Set<Geocache> cachesReloaded = searchResult.getCachesFromSearchResult(LoadFlags.LOAD_CACHE_OR_DB); - for (final Geocache cache : cachesReloaded) { - if (cache.getCoords() == null && StringUtils.isNotEmpty(cache.getDirectionImg())) { - DirectionImage.getDrawable(cache.getDirectionImg()); - } - } - } - return searchResult; } diff --git a/main/src/cgeo/geocaching/ui/CacheListAdapter.java b/main/src/cgeo/geocaching/ui/CacheListAdapter.java index 34cac01..ebbe23f 100644 --- a/main/src/cgeo/geocaching/ui/CacheListAdapter.java +++ b/main/src/cgeo/geocaching/ui/CacheListAdapter.java @@ -27,9 +27,13 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.eclipse.jdt.annotation.NonNull; +import rx.android.schedulers.AndroidSchedulers; +import rx.functions.Action1; + import android.annotation.SuppressLint; import android.app.Activity; import android.content.res.Resources; +import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; import android.text.Spannable; @@ -111,6 +115,7 @@ public class CacheListAdapter extends ArrayAdapter<Geocache> { @InjectView(R.id.inventory) protected ImageView inventory; @InjectView(R.id.direction) protected CompassMiniView direction; @InjectView(R.id.dirimg) protected ImageView dirImg; + public Geocache cache = null; public ViewHolder(final View view) { super(view); @@ -378,6 +383,7 @@ public class CacheListAdapter extends ArrayAdapter<Geocache> { } else { holder = (ViewHolder) v.getTag(); } + holder.cache = cache; final boolean lightSkin = Settings.isLightSkin(); @@ -457,9 +463,17 @@ public class CacheListAdapter extends ArrayAdapter<Geocache> { holder.direction.updateAzimuth(azimuth); holder.direction.updateHeading(cache.getDirection()); } else if (StringUtils.isNotBlank(cache.getDirectionImg())) { - holder.dirImg.setImageDrawable(DirectionImage.getDrawable(cache.getDirectionImg())); - holder.dirImg.setVisibility(View.VISIBLE); + holder.dirImg.setVisibility(View.INVISIBLE); holder.direction.setVisibility(View.GONE); + DirectionImage.fetchDrawable(cache.getDirectionImg()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<BitmapDrawable>() { + @Override + public void call(final BitmapDrawable bitmapDrawable) { + if (cache == holder.cache) { + holder.dirImg.setImageDrawable(bitmapDrawable); + holder.dirImg.setVisibility(View.VISIBLE); + } + } + }); } else { holder.dirImg.setVisibility(View.GONE); holder.direction.setVisibility(View.GONE); diff --git a/main/src/cgeo/geocaching/ui/DirectionImage.java b/main/src/cgeo/geocaching/ui/DirectionImage.java index cd7695e..e08ff51 100644 --- a/main/src/cgeo/geocaching/ui/DirectionImage.java +++ b/main/src/cgeo/geocaching/ui/DirectionImage.java @@ -3,22 +3,22 @@ package cgeo.geocaching.ui; import cgeo.geocaching.list.StoredList; import cgeo.geocaching.network.HtmlImage; -import org.apache.commons.lang3.StringUtils; +import rx.Observable; import android.graphics.drawable.BitmapDrawable; public class DirectionImage { - static private HtmlImage htmlImage = new HtmlImage(HtmlImage.SHARED, false, StoredList.STANDARD_LIST_ID, false); + static final private HtmlImage HTML_IMAGE = new HtmlImage(HtmlImage.SHARED, false, StoredList.STANDARD_LIST_ID, false); /** * Retrieve the direction image corresponding to the direction code. * * @param directionCode one of the eight cardinal points - * @return a drawable with the arrow pointing into the right direction + * @return an observable containing zero or more drawables (the last one being the freshest image) */ - public static BitmapDrawable getDrawable(final String directionCode) { - return StringUtils.isNotBlank(directionCode) ? htmlImage.getDrawable("http://www.geocaching.com/images/icons/compass/" + directionCode + ".gif") : null; + public static Observable<BitmapDrawable> fetchDrawable(final String directionCode) { + return HTML_IMAGE.fetchDrawable("https://www.geocaching.com/images/icons/compass/" + directionCode + ".gif"); } } |
