2016-05-17 14 views
1

Ich versuche, ein Projekt auf Steganographie, in dem nach dem Verbergen der Nachricht in Bild, ich möchte das Bild zu wamp Server auf dem PC senden. Es folgt haben die AsyncTask ich verwendet, um ein Bild zu senden, um wamp Server, in dem bin ich die Fatal Exception bekommen:java.lang.OutOfMemoryError Fehler in 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(); 

} 

}

Der Logcat Ausgang Ich erhalte ist

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) 

Was ist hier schiefgelaufen ??

+0

'Was ist hier schiefgelaufen ??' Ein sehr großes Bild alle geladen im Speicher –

+0

haben Sie nicht bekommen .... Was muss hier geändert werden ...? –

+0

In uploadimage ... laden Sie ein Bild im Speicher. Dieses Bild ist einfach zu groß. –

Antwort

1

Android legt eine feste Grenze für die Größe des Heapspeichers für jede App fest. Die genaue Größe der Heap-Größe variiert zwischen den Geräten basierend darauf, wie viel RAM das Gerät insgesamt zur Verfügung hat. Wenn Ihre App die Kapazität des Heapspeichers erreicht hat und versucht, mehr Arbeitsspeicher zuzuweisen, erhält sie eine OutOfMemoryError.

Sie sollten Heap-Größe erhöhen und Bildgröße reduzieren. Hoffe das hilft .

+1

Danke @Amiya ... Ich habe so lange selbst zurück. –

Verwandte Themen