gpt4 book ai didi

java - 将图像从android发送到php服务器时出现OutOfMemoryError

转载 作者:太空狗 更新时间:2023-10-29 16:40:21 25 4
gpt4 key购买 nike

我正在尝试将图像从我的 SD 卡发送到 PHP 服务器...我创建了 2 个类:第一个是 MainActivity.java,第二个是 Base64.java,它以 Base64 格式编码字节。

我的 MainActivity.java 是:

public class MainActivity extends Activity {
InputStream inputStream;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.activity_main);

Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/DCIM/Camera/1378889572299.jpg");
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream); //compress to which format you want.
byte [] byte_arr = stream.toByteArray();
String image_str = Base64.encodeBytes(byte_arr);
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

nameValuePairs.add(new BasicNameValuePair("image",image_str));
Log.e("ok", "1");
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://myserver.com/upload_image.php");
Log.e("ok", "3");
try {
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
Log.e("ok", "4");
HttpResponse response = httpclient.execute(httppost);
Log.e("ok", "5");

String the_string_response = convertResponseToString(response);
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

public String convertResponseToString(HttpResponse response) throws IllegalStateException, IOException{

String res = "";
StringBuffer buffer = new StringBuffer();
inputStream = response.getEntity().getContent();
final int contentLength = (int) response.getEntity().getContentLength(); //getting content length…..
runOnUiThread(new Runnable() {

@Override
public void run() {
Toast.makeText(MainActivity.this, "contentLength : " + contentLength, Toast.LENGTH_LONG).show();
}
});

if (contentLength < 0){
}
else{
byte[] data = new byte[512];
int len = 0;
try
{
while (-1 != (len = inputStream.read(data)) )
{
buffer.append(new String(data, 0, len)); //converting to string and appending to stringbuffer…..
}
}
catch (IOException e)
{
e.printStackTrace();
}
try
{
inputStream.close(); // closing the stream…..
}
catch (IOException e)
{
e.printStackTrace();
}
res = buffer.toString(); // converting stringbuffer to string…..
final String res2 = res;
runOnUiThread(new Runnable() {

@Override
public void run() {
Toast.makeText(MainActivity.this, "Result : " + res2, Toast.LENGTH_LONG).show();
}
});
//System.out.println("Response => " + EntityUtils.toString(response.getEntity()));
}
return res;
}
}

我有这个错误:

........OutOfMemoryError
….at java.lang.AbstractStringBuilder.(AbstractStringBuilder.java:81)
….at java.lang.StringBuilder.(StringBuilder.java:68)
….at java.net.URLEncoder.encode(URLEncoder.java:98)
….at org.apache.http.client.utils.URLEncodedUtils.encode(URLEncodedUtils.java:184)
….at org.apache.http.client.utils.URLEncodedUtils.format(URLEncodedUtils.java:163)
….at org.apache.http.client.entity.UrlEncodedFormEntity.(UrlEncodedFormEntity.java:71)
….at com.example.imageuploadonserver.MainActivity.onCreate(MainActivity.java:43)

第 43 行是:httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

我对我的代码进行了一些更改...并将图像源从我的 sdcard 替换为我的 drawabel.ic_luncher :

Bitmap bitmap = BitmapFactory.decodeFile(“/sdcard/DCIM/Camera/1378889572299.jpg”);

通过这个:

Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher);

它成功地工作了!!!!

我在谷歌上搜索了很多,但要么我使用了错误的关键字,要么互联网上没有简单的解决方案。我希望这里有人可以帮助我。

在此先致以最诚挚的问候和感谢,Fadel。

最佳答案

假设您的图像是大约 5Mo,因为它是您相机拍摄的照片。

  1. 当您将其作为位图加载时,您的堆大小会增加 5Mo。
  2. 然后你用som压缩把它转换成一个字节数组,所以你的堆大小可能又增长了4Mo => 9Mo
  3. 然后将它进行 base64 编码为字符串,堆再次增长 4Mo => 13Mo
  4. 然后,通过将它作为字符串添加到 NameValu¨Pair,我认为它复制了字符串(此处不确定)并且堆再次增长 => 17Mo
  5. 然后当您将它添加为实体时,它会对内容进行编码,并且堆再次增长 => 22Mo

当你不再需要它时,你应该尝试释放内存:

  1. 在第 2 步之后使用 bitmap.recycle()。
  2. 在第 3 步之后将 bite 数组设置为 null
  3. 在第 4 步之后将您的字符串设置为 null(不确定)

这样做你将释放大约 9 到 14Mo

但在所有情况下,通过对其进行编码(base64Encode 或 UrlEncode),您的堆大小将增长为位图大小的两倍。更好的方法应该是将文件的内容写入 HTTP 流,然后从文件中读取。

关于java - 将图像从android发送到php服务器时出现OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18745746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com