Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Asynctask中的java.lang.OutOfMemoryError错误_Android - Fatal编程技术网

Android Asynctask中的java.lang.OutOfMemoryError错误

Android Asynctask中的java.lang.OutOfMemoryError错误,android,Android,我正在尝试进行一个关于隐写术的项目,在该项目中,在图像中隐藏消息后,我希望将图像发送到电脑中的wamp服务器。以下是我用于将图像发送到wamp服务器的异步任务,我在其中收到致命异常: private class UploadImage extends AsyncTask<Void, Void, Void> { Bitmap image; String name; ArrayList<NameValuePair> dataToSend = new ArrayList();

我正在尝试进行一个关于隐写术的项目,在该项目中,在图像中隐藏消息后,我希望将图像发送到电脑中的wamp服务器。以下是我用于将图像发送到wamp服务器的异步任务,我在其中收到致命异常:

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();

}
私有类上载映像扩展异步任务{
位图图像;
字符串名;
ArrayList dataToSend=新的ArrayList();
公共上载映像(字符串名称){
字符串路径=Environment.getExternalStorageDirectory().toString();
path=path+“/stegimg1.png”;
位图SendImg1=位图工厂.decodeFile(路径);
this.image=SendImg1;
this.name=名称;
//Toast.makeText(getApplicationContext(),“Constructor-UpImg”,Toast.LENGTH\u SHORT.show();
}
@凌驾
受保护的Void doInBackground(Void…arg0){
HttpParams httpRequestParams=getHttpRequestParams();
HttpClient客户端=新的默认HttpClient(httpRequestParams);
HttpPost=newhttppost(SERVERADDRESS+“/SavePicture.php”);
试一试{
post.setEntity(新的UrlEncodedFormEntity(dataToSend));
客户。执行(post);
}捕获(例外e)
{
e、 printStackTrace();
}
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
//TODO自动生成的方法存根
Toast.makeText(getApplicationContext(),“发送到服务器的图像”,Toast.LENGTH\u SHORT.show();
super.onPostExecute(结果);
//Toast.makeText(getApplicationContext(),“上传图像”,Toast.LENGTH\u SHORT.show();
}
@凌驾
受保护的void onPreExecute(){
Toast.makeText(getApplicationContext(),“Inside OnPreEXEC”,Toast.LENGTH_SHORT.show();
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.PNG,100,baos);
字符串encodedImage=Base64.encodeToString(baos.toByteArray(),Base64.DEFAULT);
添加(新的BasicNameValuePair(“图像”,encodedImage));
添加(新的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)
05-17 16:45:39.077:E/AndroidRuntime(1860):致命异常:AsyncTask#1
05-17 16:45:39.077:E/AndroidRuntime(1860):java.lang.RuntimeException:执行doInBackground()时出错
05-17 16:45:39.077:E/AndroidRuntime(1860):在android.os.AsyncTask$3.done(AsyncTask.java:299)
05-17 16:45:39.077:E/AndroidRuntime(1860):在java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
05-17 16:45:39.077:E/AndroidRuntime(1860):位于java.util.concurrent.FutureTask.setException(FutureTask.java:219)
05-17 16:45:39.077:E/AndroidRuntime(1860):在java.util.concurrent.FutureTask.run(FutureTask.java:239)
05-17 16:45:39.077:E/AndroidRuntime(1860):在android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
05-17 16:45:39.077:E/AndroidRuntime(1860):位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
05-17 16:45:39.077:E/AndroidRuntime(1860):位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
05-17 16:45:39.077:E/AndroidRuntime(1860):在java.lang.Thread.run(Thread.java:856)
05-17 16:45:39.077:E/AndroidRuntime(1860):由以下原因引起:java.lang.OutOfMemoryError
05-17 16:45:39.077:E/AndroidRuntime(1860):位于java.lang.String。(String.java:365)
05-17 16:45:39.077:E/AndroidRuntime(1860):位于java.lang.String.(String.java:228)
05-17 16:45:39.077:E/AndroidRuntime(1860):位于android.util.Base64.encodeToString(Base64.java:456)
05-17 16:45:39.077:E/AndroidRuntime(1860):位于com.msrohit.imageselect.MainActivity$UploadImage.doInBackground(MainActivity.java:209)
这里出了什么问题

Android对每个应用程序的堆大小设置了硬限制。确切的 堆大小限制因设备的RAM大小而异 设备已全部可用。如果您的应用程序已到达堆 容量,并尝试分配更多内存,它将收到 OutOfMemoryError


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

这里出了什么问题???
一个很大的图像都加载到了内存中,您无法理解…这里需要更改什么…?在上传的图像中。。。您正在内存中加载图像。那个图像太大了。例如,你可以流式传输它。这是不可取的,因为这就像说
我可以增加用户设备的内存吗?
。相反,您可以增加应用程序使用的堆大小。谢谢Bob。。。。你成就了我的一天…干杯谢谢你@Amiya…我早就回来了。