2014-04-09 111 views
1

我得到這個例外java.lang.OutOfMemoryError編碼位圖爲Base64

Process: ua.khuta.mobilereception, PID: 7601 
    java.lang.RuntimeException: An error occured while executing doInBackground() 
    at android.os.AsyncTask$3.done(AsyncTask.java:300) 
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
    at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
    at java.lang.Thread.run(Thread.java:841) 
    Caused by: java.lang.OutOfMemoryError 
    at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:94) 
    at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:145) 
    at java.lang.StringBuilder.append(StringBuilder.java:216) 
    at ua.khuta.mobilereception.ReportAboutProblem$Report.doInBackground(ReportAboutProblem.java:360) 
    at ua.khuta.mobilereception.ReportAboutProblem$Report.doInBackground(ReportAboutProblem.java:347) 
    at android.os.AsyncTask$2.call(AsyncTask.java:288) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:237) 

唯一的例外是在這條線:

files+="[\""+encodeTobase64(myImages.get(i))+"\",\""+i+"image.jpg\"]"; 

myImages - 位圖

public static String encodeTobase64(Bitmap image) { 
    ByteArrayOutputStream baos=new ByteArrayOutputStream(); 
    image.compress(Bitmap.CompressFormat.JPEG,100, baos); 
    byte [] b=baos.toByteArray(); 
    String temp=null; 
    try{ 
     System.gc(); 
     temp=Base64.encodeToString(b, Base64.DEFAULT); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    }catch(OutOfMemoryError e){ 
     baos=new ByteArrayOutputStream(); 
     image.compress(Bitmap.CompressFormat.JPEG,50, baos); 
     b=baos.toByteArray(); 
     temp=Base64.encodeToString(b, Base64.DEFAULT); 
     Log.e("EWN", "Out of memory error catched"); 
    } 
    return temp; 
} 

的數組列表這取決於照片,當我從照相機加載3張照片到位圖陣列 - 當來自Galery的3張照片時 - 一切都很好 - 出現錯誤。

+0

你試過我的解決方案? – Gattsu

回答

0

請參閱此問題的官方文檔。在這裏你會找到一個妥善的解決辦法:

http://developer.android.com/training/displaying-bitmaps/index.html

+0

如果有幫助,請將我的回答投票回答 –

+0

不,在編碼時得到此異常,而不是在顯示圖像 –

+0

如果您閱讀該文檔,那麼您將明白確切的問題。這也是編碼不用於顯示也。但你沒有讀到.... http://developer.android.com/training/displaying-bitmaps/load-bitmap.html這正是你需要的 –

0

您可以要求通過在manifest使用

android:largeHeap="true" 

使用更多的內存。

此外,您可以使用本機內存(NDK & JNI),因此您實際上繞過了堆大小限制。

這裏有一些職位方面看:

,這裏是爲它做了一個庫:

快樂編碼

問候行家