У меня есть приложение на Android, в котором я работаю с действительно большими изображениями (640x480)
и чуть больше. На самом деле это снимки, сделанные камерой, затем редактируются, после чего сохраняются в sdcard
и, наконец, загружаются на сервер.
Но проблема, с которой я сталкиваюсь - VM memory exceeded
при работе с bitmaps
.
Я делаю что-то вроде этого:
В первом задании я получаю the bytes from the camera
и создаю bitmap
, который редактируется и затем сохраняется в sdcard
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
options.inDither = true;
byte[] imageData = extras.getByteArray("imageData");
myImage = BitmapFactory.decodeByteArray(imageData, 0,
imageData.length, options);
Matrix mat = new Matrix();
mat.postRotate(90);
if(myImage !=null){
bitmapResult = Bitmap.createBitmap(myImage.get(), 0, 0, (myImage.get()).getWidth(),
(myImage.get()).getHeight(), mat, true);
в onPause()
метод я сделал это:
bitmapResult.recycle();
bitmapResult=null;
Во втором упражнении я читаю файл из sdcard
и отображаю его на экране. Почему? У меня есть причины:
File f=new File("/sdcard/Images/android.jpg");
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inTempStorage = new byte[16*1024];
o2.inSampleSize=8;
o2.outWidth=100;
o2.outHeight=100;
try {
x = BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(x != null){
myImage.setImageBitmap(x);
}
И сделал то же самое в onPause()
x.recycle();
x=null;
Все это не сработало, и после того, как я сделал несколько снимков, мое приложение упало.
Я пытался использовать WeaakReference
вместо bitmap
:
myImage = new WeakReference<Bitmap>(BitmapFactory.decodeByteArray(imageData, 0,
imageData.length, options));
И все равно ничего .... та же ошибка .... out of memory
.
Кто-нибудь есть идеи?
P.S .: Я также пытался дозвониться до System.gc()
, но с тем же результатом!
Так что, пожалуйста, помогите мне!