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