java.lang.OutOfMemoryError编码到Base64的位图

时间:2014-04-09 08:52:47

标签: android bitmap base64 out-of-memory

我得到了这个例外

 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张照片时 - 得到错误。

2 个答案:

答案 0 :(得分:0)

有关此问题,请参阅官方文档。你会在这里找到一个合适的解决方案:

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

答案 1 :(得分:0)

您可以使用

请求使用更多内存
 android:largeHeap="true"
清单中的

另外,您可以使用本机内存(NDK和JNI),因此您实际上绕过了堆大小限制。

这里有一些关于它的帖子:

这是一个为它制作的图书馆:

快乐编码

关于maven