Cancel asset fetching when the app view is paused

This commit is contained in:
Cameron Gutman 2015-02-26 18:30:02 -05:00
parent f1787c43e5
commit 1b8d2bc81c
2 changed files with 30 additions and 2 deletions

View File

@ -174,6 +174,10 @@ public class AppView extends Activity implements AdapterFragmentCallbacks {
if (managerBinder != null) { if (managerBinder != null) {
managerBinder.stopPolling(); managerBinder.stopPolling();
} }
if (appGridAdapter != null) {
appGridAdapter.cancelQueuedOperations();
}
} }
@Override @Override

View File

@ -15,6 +15,7 @@ import com.limelight.nvstream.http.ComputerDetails;
import java.security.KeyManagementException; import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@ -24,6 +25,7 @@ public class AppGridAdapter extends GenericGridAdapter<AppView.AppObject> {
private final CachedAppAssetLoader loader; private final CachedAppAssetLoader loader;
private final ConcurrentHashMap<ImageView, CachedAppAssetLoader.LoaderTuple> loadingTuples = new ConcurrentHashMap<>(); private final ConcurrentHashMap<ImageView, CachedAppAssetLoader.LoaderTuple> loadingTuples = new ConcurrentHashMap<>();
private final ConcurrentHashMap<Object, CachedAppAssetLoader.LoaderTuple> backgroundLoadingTuples = new ConcurrentHashMap<>();
public AppGridAdapter(Activity activity, boolean listMode, boolean small, ComputerDetails computer, String uniqueId) throws KeyManagementException, NoSuchAlgorithmException { public AppGridAdapter(Activity activity, boolean listMode, boolean small, ComputerDetails computer, String uniqueId) throws KeyManagementException, NoSuchAlgorithmException {
super(activity, listMode ? R.layout.simple_row : (small ? R.layout.app_grid_item_small : R.layout.app_grid_item), R.drawable.image_loading); super(activity, listMode ? R.layout.simple_row : (small ? R.layout.app_grid_item_small : R.layout.app_grid_item), R.drawable.image_loading);
@ -33,6 +35,21 @@ public class AppGridAdapter extends GenericGridAdapter<AppView.AppObject> {
new MemoryAssetLoader(), new DiskAssetLoader(context.getCacheDir())); new MemoryAssetLoader(), new DiskAssetLoader(context.getCacheDir()));
} }
private static void cancelTuples(ConcurrentHashMap<?, CachedAppAssetLoader.LoaderTuple> map) {
Collection<CachedAppAssetLoader.LoaderTuple> tuples = map.values();
for (CachedAppAssetLoader.LoaderTuple tuple : tuples) {
tuple.cancel();
}
map.clear();
}
public void cancelQueuedOperations() {
cancelTuples(loadingTuples);
cancelTuples(backgroundLoadingTuples);
}
private void sortList() { private void sortList() {
Collections.sort(itemList, new Comparator<AppView.AppObject>() { Collections.sort(itemList, new Comparator<AppView.AppObject>() {
@Override @Override
@ -44,7 +61,12 @@ public class AppGridAdapter extends GenericGridAdapter<AppView.AppObject> {
public void addApp(AppView.AppObject app) { public void addApp(AppView.AppObject app) {
// Queue a request to fetch this bitmap in the background // Queue a request to fetch this bitmap in the background
loader.loadBitmapWithContextInBackground(app.app, null, backgroundLoadListener); Object tupleKey = new Object();
CachedAppAssetLoader.LoaderTuple tuple =
loader.loadBitmapWithContextInBackground(app.app, tupleKey, backgroundLoadListener);
if (tuple != null) {
backgroundLoadingTuples.put(tupleKey, tuple);
}
itemList.add(app); itemList.add(app);
sortList(); sortList();
@ -94,7 +116,9 @@ public class AppGridAdapter extends GenericGridAdapter<AppView.AppObject> {
public void notifyLongLoad(Object object) {} public void notifyLongLoad(Object object) {}
@Override @Override
public void notifyLoadComplete(Object object, final Bitmap bitmap) {} public void notifyLoadComplete(Object object, final Bitmap bitmap) {
backgroundLoadingTuples.remove(object);
}
}; };
public boolean populateImageView(final ImageView imgView, final AppView.AppObject obj) { public boolean populateImageView(final ImageView imgView, final AppView.AppObject obj) {