2016-05-17 16 views
-1

dies mein ist doInBackground() in der Klasse NetworkFATAL AUSNAHME: AsyncTask # 2 java.lang.RuntimeException: Ein Fehler ist aufgetreten, während doInBackground Ausführung() .. Verursacht durch: java.lang.OutOfMemoryError

@Override 
protected String doInBackground(Void...pParams) { 

    try { 
     // check if connected to Internet 
     if(vIsConnectionAvailable()) { 
      // create the URL with the target URL specified 
      URL url = new URL(vTargetURL); 
      // create a HTTP connection to the URL specified 
      HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection(); 
      // set the timeout for the request 
      urlConnection.setReadTimeout(REQUEST_TIMEOUT); 
      urlConnection.setConnectTimeout(REQUEST_TIMEOUT); 
      //add request header 
      urlConnection.setRequestMethod("POST"); 
      // set the HTTP headers for the request. 
      urlConnection.setRequestProperty("Content-Length", String.valueOf(vRequestXML.length())); 
      for (HashMap.Entry<String, String> entry : vHttpHeaders.entrySet()) { 
       urlConnection.setRequestProperty(entry.getKey(), entry.getValue()); 
      } 
      // send the request 
      DataOutputStream dataOutputStream = new DataOutputStream(urlConnection.getOutputStream()); 
      dataOutputStream.writeBytes(vRequestXML); 
      dataOutputStream.flush(); 
      dataOutputStream.close(); 

      // read the response 
      //int bufferSize = 1024 * 100; // 10KB. // Integer.MAX_VALUE - 1000; // 
      //int fileSize = 100 * 1024; // 100 * 1024 * 1024 = 100MB. 

      //BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); 
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); 
      String inrtermediateLine; 
      StringBuffer responseBuffer = new StringBuffer(); 
      while ((inrtermediateLine = bufferedReader.readLine()) != null) { 
       responseBuffer.append(inrtermediateLine); 
      } 
      // close the bufferedReader 
      bufferedReader.close(); 
      return responseBuffer.toString(); 
     } 
     else {} 
} 

    catch (SocketTimeoutException exception) { 

     vErrorCode = -2; //Request Timed out 
     return null; 
    } 

    catch (IOException exception) { 
     vErrorCode = -3; //Not able to connect to the target server 
     return null; 
    } 
} 

für xml Anfrage ich bekomme sehr große Antwort und für kleine Antwort es funktioniert gut ... bitte helfen Sie mir aus diesem !! kann ich XML-Datei verwenden, um Antwort zu speichern? wenn dann bitte helfen, wie XML-Datei für diese Antwort zu erstellen ..

dies ist mein Wunsch Format ... public void vGetPnLData() {

String getReportXML = "<ENVELOPE>....."; 
    HashMap<String, String> httpHeaders = new HashMap<String, String>(); 

    // set the headers 
    httpHeaders.put("ID", MainActivity.vReportName); 
    httpHeaders.put("SOURCE", "EA"); 
    httpHeaders.put("TARGET", "TALLY"); 
    httpHeaders.put("Content-Type", "text/xml; charset=utf-8"); 
    httpHeaders.put("Accept-Encoding", "identity"); 
    httpHeaders.put("TARGETACCOUNTINTERNALID", MainActivity.vAccountInternalId); 
    httpHeaders.put("TARGETCOMPANYNAME", MainActivity.vConnectedCompany); 

    // create an object NetwrokManager class. This is an AsyncTask which handles everything related to sending the HTTP requests 
    NetworkManager networkMgrObj = new NetworkManager(MainActivity.vReportName, MainActivity.vTrbUrl, getReportXML, httpHeaders); 
    // execute the AyncTask 
    networkMgrObj.execute(); 
} 

public static void getPLDataResponseCallback(String pResponse) { 

    // parse the response to get the report data 
    String pLSheetData[][] = XMLParser.getPLBackupReportData(pResponse); 

    if (pLSheetData == null) 
    { 
     // show the error message 
     //Error = "No Data found. Please check report in Tally"; 
    } 
    else 
    {....}} 

das gibt mir folgende Fehler ....

E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2 
Process: com.visionsolutionsindia.visiontallyapp, PID: 5335 
java.lang.RuntimeException: An error occurred while executing doInBackground() 
at android.os.AsyncTask$3.done(AsyncTask.java:309) 
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) 
at java.util.concurrent.FutureTask.setException(FutureTask.java:223) 
at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)                       
at java.lang.Thread.run(Thread.java:818) 
Caused by: java.lang.OutOfMemoryError: Failed to allocate a 57283554 byte allocation with 16777216 free bytes and 51MB until OOM 
at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:95) 
at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:146)                       
at java.lang.StringBuffer.append(StringBuffer.java:219)                       
at com.visionsolutionsindia.visiontallyapp.NetworkManager.doInBackground(NetworkManager.java:103) 
at com.visionsolutionsindia.visiontallyapp.NetworkManager.doInBackground(NetworkManager.java:39) 
at android.os.AsyncTask$2.call(AsyncTask.java:295) 
at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)                        
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
at java.lang.Thread.run(Thread.java:818)  
+2

Speicherzuordnung failes (siehe Verursacht durch: java.lang.OutOfMemoryError: Es konnte keine 57.283.554 Byte-Zuordnung mit 16777216 freien Bytes und 51MB bis OOM ... zuzuteilen). Gibt es eine Chance, Ihr Paket in kleinere Stücke zu teilen? – KimKulling

+0

Sie wissen, wie man spaltet? – user6344335Tejpal

+0

jemand @KimKulling bitte geben Sie mir antworten .... – user6344335Tejpal

Antwort

0

Try die eingehende Antwort in ein Bündel von responseBuffer -Pakete zu trennen und die Eingangsleitungen der Pakete handhaben:

// Set an upper limit for responsebuffer size 
static const int BLOCKSIZE = 1024; 
while ((inrtermediateLine = bufferedReader.readLine()) != null) { 
    responseBuffer.append(inrtermediateLine); 
    if (responseBuffer.lenght() > BLOCKSIZE) { 
     // implement your response ahndling here! 
     handleResponse(responseBuffer); 
     responseBuffer.delete(0, responseBuffer.length()); 
    } 
} 

In Ihrem Code erhöhen Sie den Antwortpuffer, bis kein Speicher mehr zu reservieren ist. Speziell für ein Embedded-Gerät ist dies eine gefährliche Strategie, um Big Data-Blobs zu handhaben.

+0

was handle (responseBuffer); in deinem Code ??? – user6344335Tejpal

+0

Der Ort, an dem Sie Ihre eigene Behandlung der Antwort implementieren müssen, die empfangen wurde. – KimKulling

+0

können Sie mir bitte helfen .. zu implementieren i knowlwdge über handle dont haben() als im nicht es in Android bekommen .... – user6344335Tejpal

Verwandte Themen