2012-05-09 2 views
2

Я попытался написать какой-либо обработчик намерений камеры для съемки и последующей прецессии (при необходимости). Если я делаю снимки с высоким разрешением, моя программа прерывается с «слишком большим распределением». если я возьму немного с более низким разрешением, я смогу взять больше, но он тоже сломается. После некоторого поиска я узнал, что мне приходится перерабатывать растровые изображения, которые я сделал вручную. но проблема не исчезла. моя главная проблема заключается в том, что я не знаю, есть ли 1. утечка памяти в моем коде 2. Я не знаю, почему он пытается выделить причину, по которой я не показываю растровые изображения в моей программе (на данный момент) , я просто сохраняю их для дальнейшего повторного использования.утечка памяти в то время как обработка растрового изображения

public void onClick(View view) { 
    Intent i = new Intent("android.media.action.IMAGE_CAPTURE"); 
    this.mLastPic = new File(this.mFs.getDirPath(), this.mFs.getNextPicName()); //create and save a file for pic 
    i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(this.mLastPic)); 
    this.startActivityForResult(i, 0); 
} 

ВКЛЮЧЕНО activty обработчиком результата

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if(resultCode == Activity.RESULT_OK && requestCode == 0) { 

     try { 
      if(!this.mController.getSetting(R.string.USE_HEIGH_RESOLUTION)) { //use high res or not 
       int quality = this.mFs.getPicQuality(); //get compress quality 
       Bitmap pic = BitmapFactory.decodeFile(this.mLastPic.getPath()); 
       ByteArrayOutputStream outStream = new ByteArrayOutputStream(); 
       pic.compress(Bitmap.CompressFormat.JPEG, quality, outStream); 
       String path = this.mLastPic.getPath(); 
       if(this.mLastPic.delete()) { //replace the old file with a now file 
        File newFile = new File(path); 
        newFile.createNewFile(); 
        FileOutputStream os = new FileOutputStream(newFile); 
        os.write(outStream.toByteArray()); 
        Log.d("newEntryActivity.onActivityResult", "replaced pic "); 
       } else { 
        Log.d("newEntryActivity.onActivityResult", "cant delete old pic"); 
       } 
       pic.recycle(); //cleaning up 
       outStream.close(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

LogCat показывает

05-09 14:35:01.694: E/dalvikvm-heap(845): 6380496-byte external allocation too large for this process. 05-09 14:35:01.694: E/(845): VM won't let us allocate 6380496 bytes

05-09 14:35:01.694: D/AndroidRuntime(845): Shutting down VM

05-09 14:35:01.694: W/dalvikvm(845): threadid=3: thread exiting with uncaught exception (group=0x4001b188)

05-09 14:35:01.694: E/AndroidRuntime(845): Uncaught handler: thread main exiting due to uncaught exception

05-09 14:35:01.714: E/AndroidRuntime(845): java.lang.RuntimeException: Unable to start activity ComponentInfo{unicorn.Heurazio/unicorn.Heurazio.SettingsActivity}: android.view.InflateException: Binary XML file line #2: Error inflating class ...

05-09 14:35:01.714: E/AndroidRuntime(845): Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class

05-09 14:35:01.714: E/AndroidRuntime(845): at android.view.LayoutInflater.createView(LayoutInflater.java:513)

05-09 14:35:01.714: E/AndroidRuntime(845): at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)

05-09 14:35:01.714: E/AndroidRuntime(845): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563)

05-09 14:35:01.714: E/AndroidRuntime(845): at android.view.LayoutInflater.inflate(LayoutInflater.java:385)

05-09 14:35:01.714: E/AndroidRuntime(845): at android.view.LayoutInflater.inflate(LayoutInflater.java:320)

05-09 14:35:01.714: E/AndroidRuntime(845): at android.view.LayoutInflater.inflate(LayoutInflater.java:276)

05-09 14:35:01.714: E/AndroidRuntime(845): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:198)

05-09 14:35:01.714: E/AndroidRuntime(845): at android.app.Activity.setContentView(Activity.java:1622)

05-09 14:35:01.714: E/AndroidRuntime(845): at unicorn.Heurazio.SettingsActivity.onCreate(SettingsActivity.java:38)

05-09 14:35:01.714: E/AndroidRuntime(845): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)

05-09 14:35:01.714: E/AndroidRuntime(845): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)

05-09 14:35:01.714: E/AndroidRuntime(845): ... 11 more

05-09 14:35:01.714: E/AndroidRuntime(845): Caused by: java.lang.reflect.InvocationTargetException

05-09 14:35:01.714: E/AndroidRuntime(845): at android.widget.LinearLayout.(LinearLayout.java:92)

05-09 14:35:01.714: E/AndroidRuntime(845): at java.lang.reflect.Constructor.constructNative(Native Method)

05-09 14:35:01.714: E/AndroidRuntime(845): at java.lang.reflect.Constructor.newInstance(Constructor.java:446)

05-09 14:35:01.714: E/AndroidRuntime(845): at android.view.LayoutInflater.createView(LayoutInflater.java:500)

05-09 14:35:01.714: E/AndroidRuntime(845): ... 21 more

05-09 14:35:01.714: E/AndroidRuntime(845): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget

05-09 14:35:01.714: E/AndroidRuntime(845): at android.graphics.Bitmap.nativeCreate(Native Method) > 05-09 14:35:01.714: E/AndroidRuntime(845): at android.graphics.Bitmap.createBitmap(Bitmap.java:468)

05-09 14:35:01.714: E/AndroidRuntime(845): at android.graphics.Bitmap.createBitmap(Bitmap.java:435)

05-09 14:35:01.714: E/AndroidRuntime(845): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:340)

05-09 14:35:01.714: E/AndroidRuntime(845): at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:488)

05-09 14:35:01.714: E/AndroidRuntime(845): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:462)

05-09 14:35:01.714: E/AndroidRuntime(845): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:323)

05-09 14:35:01.714: E/AndroidRuntime(845): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)

05-09 14:35:01.714: E/AndroidRuntime(845): at android.content.res.Resources.loadDrawable(Resources.java:1705)

05-09 14:35:01.714: E/AndroidRuntime(845): at android.content.res.TypedArray.getDrawable(TypedArray.java:548)

05-09 14:35:01.714: E/AndroidRuntime(845): at android.view.View.(View.java:1850)

05-09 14:35:01.714: E/AndroidRuntime(845): at android.view.View.(View.java:1799)

05-09 14:35:01.714: E/AndroidRuntime(845): at android.view.ViewGroup.(ViewGroup.java:284)

любая помощь будет большим.

С уважением Алекс

+0

EDIT: Я забыл сказать, что проблема возникает, когда я возвращаюсь к активности privios и/или начинаю другое намерение. – Alex

ответ

0

После некоторого чтения и модификации моей программы, например, добавления ссылки на фон в перегруженном приложении, очистки всех ненужных элементов контекста, я все еще испытываю такую ​​же проблему, и, похоже, это еще хуже.

, если я могу доверять расчет для размера растрового изображения

Bitmap tmp = BitmapFactory.decodeResource(this.getResources(), R.drawable.logo); 
Log.d("mainApp", tmp.getRowBytes() * tmp.getHeight()/1024 + "kB"); 

моего 100kB логотипа (.png) принимает 6mB барана (который соответствовал бы для сообщения исключения). любые идеи были бы замечательными.

+1

ok, finaly Я нашел ошибку. с помощью MAT i удалось выяснить, что у меня есть две ссылки на контекст с длительным запуском. – Alex

-3

Try, чтобы добавить в ваш манифест в приложении android:largeHeap="true"

+0

не так ли просто проблема? – Alex

+0

Это неправильный способ справиться с утечкой памяти. – sdasdadas

1

Если проанализировать журналы, выглядит как большой (~ 6MB) распределение битовой карты происходит при раздувании вид в unicorn.Heurazio.SettingsActivity. Проверьте свои ресурсы, чтобы узнать, используете ли вы какой-то большой растровый рисунок для фона.

+0

У меня фоновое изображение в каждом действии. это около 75 КБ. он помещается в макет в качестве фонового изображения. Diden't android управляет созданием и переработкой? – Alex

+1

Размер файла не всегда совпадает с размером памяти, особенно если это JPG. Да, Android должен создавать/перерабатывать/освобождать их, но иногда это не очень хорошо делать это своевременно, и вам нужно развязать взгляды вручную, чтобы помочь запросить его. – kabuko

+0

как мне развязать взгляды? sry для этого вопроса noobie ... – Alex

Смежные вопросы