Cancel load task when fragment becomes invisible (fixes crash in rotations)

This commit is contained in:
David A. Velasco 2014-12-10 12:46:34 +01:00
parent 766b51f497
commit 77554b2b51

View file

@ -83,6 +83,8 @@ public class PreviewImageFragment extends FileFragment {
private static final String TAG = PreviewImageFragment.class.getSimpleName();
private boolean mIgnoreFirstSavedState;
private LoadBitmapTask mLoadBitmapTask = null;
/**
@ -191,12 +193,22 @@ public class PreviewImageFragment extends FileFragment {
public void onStart() {
super.onStart();
if (getFile() != null) {
BitmapLoader bl = new BitmapLoader(mImageView, mMessageView, mProgressWheel);
bl.execute(new String[]{getFile().getStoragePath()});
mLoadBitmapTask = new LoadBitmapTask(mImageView, mMessageView, mProgressWheel);
mLoadBitmapTask.execute(new String[]{getFile().getStoragePath()});
}
}
@Override
public void onStop() {
super.onStop();
if (mLoadBitmapTask != null) {
mLoadBitmapTask.cancel(true);
mLoadBitmapTask = null;
}
}
/**
* {@inheritDoc}
*/
@ -330,7 +342,7 @@ public class PreviewImageFragment extends FileFragment {
}
private class BitmapLoader extends AsyncTask<String, Void, Bitmap> {
private class LoadBitmapTask extends AsyncTask<String, Void, Bitmap> {
/**
* Weak reference to the target {@link ImageView} where the bitmap will be loaded into.
@ -366,7 +378,7 @@ public class PreviewImageFragment extends FileFragment {
*
* @param imageView Target {@link ImageView} where the bitmap will be loaded into.
*/
public BitmapLoader(ImageViewCustom imageView, TextView messageView, ProgressBar progressWheel) {
public LoadBitmapTask(ImageViewCustom imageView, TextView messageView, ProgressBar progressWheel) {
mImageViewRef = new WeakReference<ImageViewCustom>(imageView);
mMessageViewRef = new WeakReference<TextView>(messageView);
mProgressWheelRef = new WeakReference<ProgressBar>(progressWheel);
@ -380,6 +392,8 @@ public class PreviewImageFragment extends FileFragment {
String storagePath = params[0];
try {
if (isCancelled()) return result;
File picture = new File(storagePath);
if (picture != null) {
@ -389,6 +403,8 @@ public class PreviewImageFragment extends FileFragment {
(new BufferedInputStream(new FileInputStream(picture))));
}
if (isCancelled()) return result;
if (result == null) {
mErrorMessageId = R.string.preview_image_error_unknown_format;
Log_OC.e(TAG, "File could not be loaded as a bitmap: " + storagePath);
@ -400,6 +416,8 @@ public class PreviewImageFragment extends FileFragment {
} catch (OutOfMemoryError e) {
Log_OC.e(TAG, "Out of memory occured for file " + storagePath, e);
if (isCancelled()) return result;
// If out of memory error when loading or rotating image, try to load it scaled
result = loadScaledImage(storagePath);
@ -425,6 +443,13 @@ public class PreviewImageFragment extends FileFragment {
return result;
}
@Override
protected void onCancelled(Bitmap result) {
if (result != null) {
result.recycle();
}
}
@Override
protected void onPostExecute(Bitmap result) {
hideProgressWheel();
@ -434,7 +459,7 @@ public class PreviewImageFragment extends FileFragment {
showErrorMessage();
}
}
@SuppressLint("InlinedApi")
private void showLoadedImage(Bitmap result) {
if (mImageViewRef != null) {