2016-07-09 2 views
1

Я столкнулся с проблемой с загрузочным растровым изображением в одном из моих действий с библиотекой обрезки. Я получаю OutOfMemory ошибку, если размер изображения более чем 5 MB ... Я попыталсяjava.lang.OutOfMemoryError: Android

android:largeHeap="true" 

но это не помогло мне для решения проблемы. Мой Java-код и LogCat, как ниже

LogCat:

07-09 21:10:47.482: E/art(4870): Throwing OutOfMemoryError "Failed to allocate a 6391674 byte allocation with 6004224 free bytes and 5MB until OOM" 07-09 21:10:47.482: D/AndroidRuntime(4870): Shutting down VM 07-09 21:10:47.522: E/AndroidRuntime(4870): FATAL EXCEPTION: main 07-09 21:10:47.522: E/AndroidRuntime(4870): Process: com.karopass.status2017, PID: 4870 07-09 21:10:47.522: E/AndroidRuntime(4870): java.lang.OutOfMemoryError: Failed to allocate a 6391674 byte allocation with 6004224 free bytes and 5MB until OOM 07-09 21:10:47.522: E/AndroidRuntime(4870): at java.io.ByteArrayOutputStream.toByteArray(ByteArrayOutputStream.java:122) 07-09 21:10:47.522: E/AndroidRuntime(4870): at com.karopass.status2017.material.ImageLoader.addToDiskCache(ImageLoader.java:238) 07-09 21:10:47.522: E/AndroidRuntime(4870): at com.karopass.status2017.material.ImageLoader.saveTempImage(ImageLoader.java:271)

, а мой Java-код, как показано ниже

public File addToDiskCache(String imageName, Bitmap inImage) { 

    Log.e("Add to Disk",imageName); 

    ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes); 

    if(!mCacheDir.exists()){ 
     mCacheDir.mkdirs(); 
    } 

    File filePath=new File(mCacheDir.getPath()+File.separator+imageName); 
    if(!filePath.exists()) { 
     try { 
      filePath.createNewFile(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    OutputStream os=null; 
    try { 
      os= new FileOutputStream(filePath.getPath()); 
      os.write(bytes.toByteArray()); 
      os.flush(); 
     } catch (IOException e) { 
      Log.e("Write err",filePath.toString()); 
     }finally { 
     try { 
      os.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    Log.e("storage path",filePath.toString()); 

    return filePath; 
} 

Пожалуйста, помогите мне решить проблему.

Благодаря

+0

Может быть дубликатом с http://stackoverflow.com/questions/25719620/how-to -solve-java-lang-outofmemoryerror-problem-in-android – davidxxx

+0

Возможно, ваше растровое изображение слишком велико или, возможно, оно не вызвано этим методом, проверьте свои другие коды, чтобы узнать, забыли ли вы перерабатывать объект, особенно растровое изображение. – Harlan

ответ

1

компресс неэффективна

попробовать это при использовании растрового изображения из файла

private Bitmap sampleImage(Bitmap bitmap, int reqWidth, int reqHight) { 


     //first decode 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inJustDecodeBounds = true; 
     BitmapFactory.decodeFile("FILE_PATH",options); 
     //seconde deconde 
     options.inSampleSize = caculateSampleSize(options,reqWidth,reqHight); 
     options.inJustDecodeBounds = false; 


     bitmap = BitmapFactory.decodeFile("FILE_PATH",options); 
     return bitmap; 

    } 

private int caculateSampleSize(BitmapFactory.Options options, int reqWidth, int reqHight) { 
    int screenWidth; 
    int screenHight; 
    screenWidth = (reqWidth == 0 ? this.getResources().getDisplayMetrics().widthPixels : reqWidth); 
    screenHight = (reqHight == 0 ? this.getResources().getDisplayMetrics().heightPixels : reqHight); 
    int sampleWith = options.outWidth/screenWidth; 
    int sampleHight = options.outHeight/screenHight; 
    //use max 
    return sampleWith > sampleHight ? sampleWith : sampleHight; 
} 
Смежные вопросы