2014-04-09 78 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),因此您实际上绕过了堆大小限制。

这里有一些职位方面看:

,这里是为它做了一个库:

快乐编码

问候行家