java - bitmap.compress(Bitmap.compressFormat.JPEG,100, baos) 给我 java.lang.OutOfMemoryError

标签 java android performance base64 android-image

friend 们,

我正在使用这个函数来解码我的位图

public String BitMapToString(Bitmap bitmap){
            ByteArrayOutputStream baos=new  ByteArrayOutputStream();
            bitmap.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();
                bitmap.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;
      }

这是我从很久以前的帖子中得到的。这在 Nexus 上运行良好,但在 Samsung 上崩溃 电话...我在异步任务中调用它,但它仍然给我带来崩溃...这是异常的跟踪:

java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done in AsyncTask.java on Line 278
at java.util.concurrent.FutureTask$Sync.innerSetException in FutureTask.java on Line 273
at java.util.concurrent.FutureTask.setException in FutureTask.java on Line 124
at java.util.concurrent.FutureTask$Sync.innerRun in FutureTask.java on Line 307
at java.util.concurrent.FutureTask.run in FutureTask.java on Line 137
at android.os.AsyncTask$SerialExecutor$1.run in AsyncTask.java on Line 208
at java.util.concurrent.ThreadPoolExecutor.runWorker in ThreadPoolExecutor.java on Line 1076
at java.util.concurrent.ThreadPoolExecutor$Worker.run in ThreadPoolExecutor.java on Line 569
at java.lang.Thread.run in Thread.java on Line 856
Caused by: java.lang.OutOfMemoryError
at java.lang.String.<init> in String.java on Line 375
at java.lang.String.<init> in String.java on Line 238
at android.util.Base64.encodeToString in Base64.java on Line 456
at com.xxx.xxxx.activity.XXXActivity$SubmitData.BitMapToString in XXXActivity.java on Line 530
at com.xxx.xxxx.activity.XXXActivity$SubmitData.doInBackground in XXXActivity.java on Line 339
at com.xxx.xxxx.activity.XXXActivity$SubmitData.doInBackground in XXXActivity.java on Line 1
at android.os.AsyncTask$2.call in AsyncTask.java on Line 264
at java.util.concurrent.FutureTask$Sync.innerRun in FutureTask.java on Line 305
... 5 more
java.lang.OutOfMemoryError
at java.lang.String.<init> in String.java on Line 375
at java.lang.String.<init> in String.java on Line 238
at android.util.Base64.encodeToString in Base64.java on Line 456
at com.xxx.xxxx.activity.XXXActivity$SubmitData.BitMapToString in XXXActivity.java on Line 530
at com.xxx.xxxx.activity.XXXActivity$SubmitData.doInBackground in XXXActivity.java on Line 339
at com.xxx.xxxx.activity.XXXActivity$SubmitData.doInBackground in XXXActivity.java on Line 1
at android.os.AsyncTask$2.call in AsyncTask.java on Line 264
at java.util.concurrent.FutureTask$Sync.innerRun in FutureTask.java on Line 305
at java.util.concurrent.FutureTask.run in FutureTask.java on Line 137
at android.os.AsyncTask$SerialExecutor$1.run in AsyncTask.java on Line 208
at java.util.concurrent.ThreadPoolExecutor.runWorker in ThreadPoolExecutor.java on Line 1076
at java.util.concurrent.ThreadPoolExecutor$Worker.run in ThreadPoolExecutor.java on Line 569
at java.lang.Thread.run in Thread.java on Line 856

最佳答案

我会看一下 Android 开发者文档,了解如何加载大位图并在将其保存到内存之前将其缩小。它可能不是您需要的解决方案,但我相信它可以帮助您指明正确的方向。

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

祝你好运!

关于java - bitmap.compress(Bitmap.compressFormat.JPEG,100, baos) 给我 java.lang.OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21193766/

相关文章:

java - 在目录中查找具有两个关键字之一的文件

java - 将设置存储在数据库中

java - Libgdx 不会在 requestRendering 上呈现

java - android 短信权限棉花糖

c# - 调用 ToString() 时对结构进行装箱

java - 字段变量产生与递归局部变量不同的结果

java - REST:如何构建一个以参数作为第一个标记的请求路径?

java - 如何使用 Assist API android m

c++ - 保存所有简单的计算或在每次需要结果时执行它们?

performance - Windows Azure 中的自定义性能计数器