Java 上载base64会导致Android应用程序中出现outofmemory错误

Java 上载base64会导致Android应用程序中出现outofmemory错误,java,android,image,out-of-memory,Java,Android,Image,Out Of Memory,我带着一个问题回来了 我正在尝试创建一个Android应用程序,允许用户从他们的图库中搜索图像并上传。但是,在高分辨率图像上,应用程序将因内存不足错误而崩溃 图像为1.7MB,分辨率为1944x1944px 在用户从他们的图库中打开一张图片后,它将被加载到imageview中,我已经将图片的大小调整为150x150像素,以防止崩溃 代码: 错误消息:我希望这是允许的 我已经尝试了bitmap=null和System.gc,但都没有帮助 当然我可以在chuncks中上传,但安卓难道不能毫无问题地上

我带着一个问题回来了

我正在尝试创建一个Android应用程序,允许用户从他们的图库中搜索图像并上传。但是,在高分辨率图像上,应用程序将因内存不足错误而崩溃

图像为1.7MB,分辨率为1944x1944px

在用户从他们的图库中打开一张图片后,它将被加载到imageview中,我已经将图片的大小调整为150x150像素,以防止崩溃

代码:

错误消息:我希望这是允许的 我已经尝试了bitmap=null和System.gc,但都没有帮助

当然我可以在chuncks中上传,但安卓难道不能毫无问题地上传1.7MB的图像吗


已经谢谢你了

如果位图已完成,则bitmap.recycle可能就是您要查找的内容

有关管理位图内存的详细信息,请选中此项

编辑:我刚刚注意到您在调用一行上的两个逻辑语句,这很难阅读


第二次编辑:问题似乎是您正在将图像的几种表示形式(位图除外)设置为字节数组、字符串和URLEncodedFormEntity,System.gc调用可能正在清理字节数组。快速谷歌提供了一个使用缓冲区发送文件的示例

图像的原始格式是什么?如果是jpeg格式,那么用于上传的png版本可能会大得多。此外,字符串表示法占用了大约2/3的内存,并且作为请求的一部分,您至少有两倍的内存。这甚至更好,因为我们的Windows、OSX和iOS应用程序也不使用base64。我还不能给你投票,但我接受了你的答案。谢谢您:
            Button buttonUploadImage = (Button) findViewById(R.id.uploadImage);
        buttonUploadImage.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view){
                dialog = ProgressDialog.show(MainActivity.this, "", 
                        "Uploading...", true);  

                    new Thread(){
                        @Override
                        public void run(){



                        Bitmap bitmap = BitmapFactory.decodeFile(picturePath);         
                        ByteArrayOutputStream stream = new ByteArrayOutputStream();
                        bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);    bitmap.recycle();
                        byte [] byte_arr = stream.toByteArray();


                        String image_str = Base64.encodeToString(byte_arr, columnIndex2);
                        bitmap = null;
                        System.gc();


                        try{

                            HttpClient httpclient = new DefaultHttpClient();
                            HttpPost httppost = new HttpPost("http://example.com/android.php");

                            List<NameValuePair> pairs = new ArrayList<NameValuePair>();
                            pairs.add(new BasicNameValuePair("image", image_str));
                            httppost.setEntity(new UrlEncodedFormEntity(pairs));
                            HttpResponse response = httpclient.execute(httppost);
                            inputStream = response.getEntity().getContent();
                            //Json stuff here to handle the response and see if it succeeded or not.