android - Asynctask 中的 java.lang.OutOfMemoryError 错误

标签 android

我正在尝试做一个关于隐写术的项目,在其中隐藏图像中的消息后,我想将图像发送到 pc 中的 wamp 服务器。以下是我用来将图像发送到 wamp 服务器的 AsyncTask,我在其中遇到了致命异常:

private class UploadImage extends AsyncTask<Void, Void, Void> {

Bitmap image;
String name;
ArrayList<NameValuePair> dataToSend = new ArrayList();

public UploadImage(String name){

    String path = Environment.getExternalStorageDirectory().toString();
    path = path+"/stegimg1.png";
    Bitmap SendImg1 = BitmapFactory.decodeFile(path);

    this.image = SendImg1;
    this.name = name;

    //Toast.makeText(getApplicationContext(), "Constructor - UpImg",Toast.LENGTH_SHORT).show();
}

@Override
protected Void doInBackground(Void... arg0) {


    HttpParams httpRequestParams = getHttpRequestParams();
    HttpClient client = new DefaultHttpClient(httpRequestParams);
    HttpPost post = new HttpPost(SERVERADDRESS + "/SavePicture.php");

    try{
        post.setEntity(new UrlEncodedFormEntity(dataToSend));
        client.execute(post);
    }catch(Exception e)
    {
        e.printStackTrace();
    }
    return null; 
}

@Override
protected void onPostExecute(Void result) {
    // TODO Auto-generated method stub

    Toast.makeText(getApplicationContext(), "Image sent to the server",Toast.LENGTH_SHORT).show();
    super.onPostExecute(result);
    //Toast.makeText(getApplicationContext(), "Image Uploaded" , Toast.LENGTH_SHORT).show();
}

@Override
protected void onPreExecute() {

    Toast.makeText(getApplicationContext(), "Inside OnPreEXEC" , Toast.LENGTH_SHORT).show();

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    image.compress(Bitmap.CompressFormat.PNG, 100, baos);
    String encodedImage = Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT);



    dataToSend.add(new BasicNameValuePair("image", encodedImage));
    dataToSend.add(new BasicNameValuePair("name", name));
    super.onPreExecute();

}

我得到的 Logcat 输出是

05-17 16:45:39.077: E/AndroidRuntime(1860): FATAL EXCEPTION: AsyncTask #1
05-17 16:45:39.077: E/AndroidRuntime(1860): java.lang.RuntimeException: An error occured while executing doInBackground()
05-17 16:45:39.077: E/AndroidRuntime(1860):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
05-17 16:45:39.077: E/AndroidRuntime(1860):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
05-17 16:45:39.077: E/AndroidRuntime(1860):     at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
05-17 16:45:39.077: E/AndroidRuntime(1860):     at java.util.concurrent.FutureTask.run(FutureTask.java:239)
05-17 16:45:39.077: E/AndroidRuntime(1860):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
05-17 16:45:39.077: E/AndroidRuntime(1860):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
05-17 16:45:39.077: E/AndroidRuntime(1860):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
05-17 16:45:39.077: E/AndroidRuntime(1860):     at java.lang.Thread.run(Thread.java:856)
05-17 16:45:39.077: E/AndroidRuntime(1860): Caused by: java.lang.OutOfMemoryError
05-17 16:45:39.077: E/AndroidRuntime(1860):     at java.lang.String.<init>(String.java:365)
05-17 16:45:39.077: E/AndroidRuntime(1860):     at java.lang.String.<init>(String.java:228)
05-17 16:45:39.077: E/AndroidRuntime(1860):     at android.util.Base64.encodeToString(Base64.java:456)
05-17 16:45:39.077: E/AndroidRuntime(1860):     at com.msrohit.imageselect.MainActivity$UploadImage.doInBackground(MainActivity.java:209)

这里出了什么问题??

最佳答案

Android sets a hard limit on the heap size for each app. The exact heap size limit varies between devices based on how much RAM the device has available overall. If your app has reached the heap capacity and tries to allocate more memory, it will receive an OutOfMemoryError.

您应该增加堆大小并减少图像大小。希望这会有所帮助。

关于android - Asynctask 中的 java.lang.OutOfMemoryError 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37282258/

相关文章:

java - 如何修复 Android 中的 NetworkonMainThreadException?

android - 还记得lazycolumn 中的滚动位置吗?

android - 如何在android中获取当前日期和当前日期的第7天?我想以图像给出的以下格式显示日期

java - 当我使用 Intent 启动 Activity 时,我的应用程序已停止工作

android - 从android studio打开项目文件夹?

Android WebView 请求焦点 : How to prevent scrolling to top?

android - TextView 不能设置 drawableLeft(或 Top、Right、Bottom)和 Shape drawable?

java - 让 edittext 显示与按下的键不同的键

android - 9 补丁背景图像的布局问题

android - Logcat 在收听桌面时钟警报 Intent 时无法在广播接收器的 onReceive 内部工作