summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Dolgov <[email protected]>2012-10-14 11:37:06 +0400
committerAndrew Dolgov <[email protected]>2012-10-14 11:37:06 +0400
commit21945b10c895d7d27ac187dd889f0ab4918d6d5e (patch)
tree54568a0d1646eecc61f60ed0937484b0b78c0547 /src
parent4ffec9aa1c33e63de4ce36f2ac9dbe788bd7fe74 (diff)
implement scaled loading of large bitmaps, do not crash on OOM errors
Diffstat (limited to 'src')
-rw-r--r--src/org/fox/ttcomics/ComicFragment.java18
-rw-r--r--src/org/fox/ttcomics/ComicListFragment.java11
-rw-r--r--src/org/fox/ttcomics/ComicPager.java10
-rw-r--r--src/org/fox/ttcomics/CommonActivity.java16
4 files changed, 43 insertions, 12 deletions
diff --git a/src/org/fox/ttcomics/ComicFragment.java b/src/org/fox/ttcomics/ComicFragment.java
index 9aa42e8..824de4c 100644
--- a/src/org/fox/ttcomics/ComicFragment.java
+++ b/src/org/fox/ttcomics/ComicFragment.java
@@ -1,5 +1,6 @@
package org.fox.ttcomics;
+import java.io.IOException;
import java.io.InputStream;
import android.app.Activity;
@@ -27,9 +28,22 @@ public class ComicFragment extends Fragment {
super();
}
- public ComicFragment(InputStream is, int page) {
+ public ComicFragment(ComicArchive archive, int page) {
super();
- m_comic = BitmapFactory.decodeStream(is);
+ try {
+ final BitmapFactory.Options options = new BitmapFactory.Options();
+ options.inJustDecodeBounds = true;
+ BitmapFactory.decodeStream(archive.getItem(page), null, options);
+
+ options.inSampleSize = CommonActivity.calculateInSampleSize(options, 512, 512);
+ options.inJustDecodeBounds = false;
+
+ m_comic = BitmapFactory.decodeStream(archive.getItem(page), null, options);
+ } catch (OutOfMemoryError e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
m_page = page;
}
diff --git a/src/org/fox/ttcomics/ComicListFragment.java b/src/org/fox/ttcomics/ComicListFragment.java
index 7bf20e6..001b53d 100644
--- a/src/org/fox/ttcomics/ComicListFragment.java
+++ b/src/org/fox/ttcomics/ComicListFragment.java
@@ -116,8 +116,17 @@ public class ComicListFragment extends Fragment implements OnItemClickListener {
if (thumbnail != null) {
if (thumbnailFile.exists()) {
- Bitmap bmp = BitmapFactory.decodeFile(thumbnailFile.getAbsolutePath());
+ //
+ final BitmapFactory.Options options = new BitmapFactory.Options();
+ options.inJustDecodeBounds = true;
+ BitmapFactory.decodeFile(thumbnailFile.getAbsolutePath(), options);
+
+ options.inSampleSize = CommonActivity.calculateInSampleSize(options, 200, 200);
+ options.inJustDecodeBounds = false;
+
+ Bitmap bmp = BitmapFactory.decodeFile(thumbnailFile.getAbsolutePath(), options);
+
if (bmp != null) {
thumbnail.setImageBitmap(bmp);
}
diff --git a/src/org/fox/ttcomics/ComicPager.java b/src/org/fox/ttcomics/ComicPager.java
index 9e00c8c..e8641db 100644
--- a/src/org/fox/ttcomics/ComicPager.java
+++ b/src/org/fox/ttcomics/ComicPager.java
@@ -28,15 +28,7 @@ public class ComicPager extends Fragment {
@Override
public Fragment getItem(int position) {
- try {
- return new ComicFragment(m_archive.getItem(position), position+1);
-
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
-
- return null;
+ return new ComicFragment(m_archive, position+1);
}
@Override
diff --git a/src/org/fox/ttcomics/CommonActivity.java b/src/org/fox/ttcomics/CommonActivity.java
index 97147d9..9569d74 100644
--- a/src/org/fox/ttcomics/CommonActivity.java
+++ b/src/org/fox/ttcomics/CommonActivity.java
@@ -7,6 +7,7 @@ import java.security.NoSuchAlgorithmException;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
+import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.preference.PreferenceManager;
@@ -171,4 +172,19 @@ public class CommonActivity extends FragmentActivity {
toast.show();
}
+ public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
+ // Raw height and width of image
+ final int height = options.outHeight;
+ final int width = options.outWidth;
+ int inSampleSize = 1;
+
+ if (height > reqHeight || width > reqWidth) {
+ if (width > height) {
+ inSampleSize = Math.round((float)height / (float)reqHeight);
+ } else {
+ inSampleSize = Math.round((float)width / (float)reqWidth);
+ }
+ }
+ return inSampleSize;
+}
}