2014-03-19 30 views
-1

我想獲取字符串字符串,並希望將其轉換爲PDF應用程序,並顯示該PDF。java.lang.String的9431460字節分配內存不足。 <init> android

我在sdcard中寫入字節。

Web服務正在使用kso​​ap2-android-assembly-2.6.1-jar-with-dependencies.jar。

以下方法在Webservice.java類中。

public static <T> T GetAttachmentasbinary(int id,String AttachmentType, String METHOD_NAME) { 
    //String resTxt = null; 
    // TODO Auto-generated method stub 
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 

    PropertyInfo PI = new PropertyInfo(); 
    PI.setName("Industry_Id"); 
    PI.setValue(id); 

    PropertyInfo At = new PropertyInfo(); 
    At.setName("AttachmentType"); 
    At.setValue(AttachmentType); 

    request.addProperty(PI); 
    request.addProperty(At); 

    T result = null; 
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
      SoapEnvelope.VER11); 
    envelope.dotNet = true; 
    // Set output SOAP object 
    envelope.setOutputSoapObject(request); 
    // Create HTTP call object 
    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 

    try { 
     // Invole web service 
     androidHttpTransport.call(SOAP_ACTION+METHOD_NAME, envelope); 
     // Get the response 
     //SoapPrimitive response = (SoapPrimitive) envelope.getResponse(); 
     // Assign it to fahren static variable 
     //resTxt = response.toString(); 
     try { 
     result = (T) envelope.getResponse(); 
     } 
     catch (SoapFault e) { 
      e.printStackTrace(); 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
     //resTxt = "Error occured"; 
    } 

    return result; 
} 

下面的代碼是線程

private class AsyncCallWS2 extends AsyncTask<String, Void, Void> { 
    protected Void doInBackground(String... params) { 
     String strBinaryPDFString = WebService.GetAttachmentasbinary(I_id,txt,"GetAttachmentasbinary").toString(); 
      File createfile = new File(Environment.getExternalStorageDirectory(),"/"); 
      createfile.mkdirs(); 
      File outputFile = new File(createfile,"FileName.pdf");//creating temporary file in phone Memory 
        try { 
         new FileOutputStream(outputFile); 
         byte[] bytes = Base64.decode(strBinaryPDFString,Base64.DEFAULT); 
         File filepath = new File(Environment.getExternalStorageDirectory(),"/FileName.pdf"); 
         OutputStream pdffos = new FileOutputStream(filepath); 
         try { 
          Log.d("Writing ","bytes"); 
         pdffos.write(bytes); 
         pdffos.flush(); 
         pdffos.close(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 

       } catch (FileNotFoundException e1) { 
        e1.printStackTrace(); 
       } 
     Intent intent = new Intent(FieldActivity.this, myPDFActivity.class); 
     intent.putExtra(PdfViewerActivity.EXTRA_PDFFILENAME,Environment.getExternalStorageDirectory()+File.separator+"FileName.pdf"); 
     startActivity(intent); 
     return null; 
    } 
} 

我打電話它通過如下列表視圖按鈕的點擊事件。

@SuppressWarnings("resource") 
public void click(View v) { 

     final int position = getListView().getPositionForView(v); 
     String text = getListView().getItemAtPosition(position).toString(); 
     txt = text.substring(text.toString().lastIndexOf("=")+1, text.length()-1); 

     AsyncCallWS2 task = new AsyncCallWS2(); 
     task.execute(); 
    } 

該代碼在運行於小的文件,但對於一個大的文件,該文件是圍繞> =大小的30 MB它顯示

3-19 13:14:43.864: I/dalvikvm-heap(350): Grow heap (frag case) to 27.276MB for 11647500-byte allocation 
03-19 13:14:44.014: D/dalvikvm(350): GC_FOR_MALLOC freed 8530K, 49% free 14356K/28039K, external 2437K/3044K, paused 45ms 
03-19 13:14:44.304: D/dalvikvm(350): GC_CONCURRENT freed <1K, 49% free 14356K/28039K, external 2437K/3044K, paused 27ms+24ms 
03-19 13:14:45.354: D/dalvikvm(350): GC_FOR_MALLOC freed 5K, 49% free 14356K/28039K, external 2437K/3044K, paused 42ms 
03-19 13:14:45.354: I/dalvikvm-heap(350): Forcing collection of SoftReferences for 9431460-byte allocation 
03-19 13:14:45.404: D/dalvikvm(350): GC_FOR_MALLOC freed 38K, 49% free 14317K/28039K, external 2437K/3044K, paused 48ms 
03-19 13:14:45.404: E/dalvikvm-heap(350): Out of memory on a 9431460-byte allocation. 
03-19 13:14:45.404: I/dalvikvm(350): "AsyncTask #4" prio=5 tid=12 RUNNABLE 
03-19 13:14:45.404: I/dalvikvm(350): | group="main" sCount=0 dsCount=0  obj=0x4071e148 self=0x334b28 
03-19 13:14:45.404: I/dalvikvm(350): | sysTid=362 nice=10 sched=0/0  cgrp=bg_non_interactive handle=4683016 
03-19 13:14:45.404: I/dalvikvm(350): | schedstat=(16356500657 1719596168 647) 
03-19 13:14:45.404: I/dalvikvm(350): at java.lang.String.<init>(String.java:~513) 
03-19 13:14:45.404: I/dalvikvm(350): at org.kxml2.io.KXmlParser.get(KXmlParser.java:610) 
03-19 13:14:45.404: I/dalvikvm(350): at  org.kxml2.io.KXmlParser.getText(KXmlParser.java:1280) 
03-19 13:14:45.404: I/dalvikvm(350): at org.ksoap2.serialization.SoapSerializationEnvelope.readUnknown(SoapSerializationEnvelope.java:256) 
03-19 13:14:45.404: I/dalvikvm(350): at org.ksoap2.serialization.SoapSerializationEnvelope.read(SoapSerializationEnvelope.java:422) 
03-19 13:14:45.404: I/dalvikvm(350): at org.ksoap2.serialization.SoapSerializationEnvelope.readUnknown(SoapSerializationEnvelope.java:289) 
03-19 13:14:45.404: I/dalvikvm(350): at org.ksoap2.serialization.SoapSerializationEnvelope.read(SoapSerializationEnvelope.java:422) 
03-19 13:14:45.404: I/dalvikvm(350): at org.ksoap2.serialization.SoapSerializationEnvelope.parseBody(SoapSerializationEnvelope.java:149) 
03-19 13:14:45.404: I/dalvikvm(350): at org.ksoap2.SoapEnvelope.parse(SoapEnvelope.java:137) 
03-19 13:14:45.404: I/dalvikvm(350): at org.ksoap2.transport.Transport.parseResponse(Transport.java:100) 
03-19 13:14:45.404: I/dalvikvm(350): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:195) 
03-19 13:14:45.404: I/dalvikvm(350): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:95) 
03-19 13:14:45.404: I/dalvikvm(350): at com.example.downloadfromwebserviceexample.WebService.GetAttachmentasbinary(WebService.java:157) 
03-19 13:14:45.404: I/dalvikvm(350): at com.example.downloadfromwebserviceexample.FieldActivity$AsyncCallWS2.doInBackground(FieldActivity.java:77) 
03-19 13:14:45.404: I/dalvikvm(350): at com.example.downloadfromwebserviceexample.FieldActivity$AsyncCallWS2.doInBackground(FieldActivity.java:1) 
03-19 13:14:45.404: I/dalvikvm(350): at android.os.AsyncTask$2.call(AsyncTask.java:185) 
03-19 13:14:45.414: I/dalvikvm(350): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 
03-19 13:14:45.414: I/dalvikvm(350): at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
03-19 13:14:45.414: I/dalvikvm(350): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
03-19 13:14:45.414: I/dalvikvm(350): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
03-19 13:14:45.414: I/dalvikvm(350): at java.lang.Thread.run(Thread.java:1019) 
03-19 13:14:45.414: W/dalvikvm(350): threadid=12: thread exiting with uncaught exception (group=0x40015560) 
03-19 13:14:45.424: E/AndroidRuntime(350): FATAL EXCEPTION: AsyncTask #4 
03-19 13:14:45.424: E/AndroidRuntime(350): java.lang.RuntimeException: An error occured while executing doInBackground() 
03-19 13:14:45.424: E/AndroidRuntime(350): at android.os.AsyncTask$3.done(AsyncTask.java:200) 
03-19 13:14:45.424: E/AndroidRuntime(350): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274) 
03-19 13:14:45.424: E/AndroidRuntime(350): at java.util.concurrent.FutureTask.setException(FutureTask.java:125) 
03-19 13:14:45.424: E/AndroidRuntime(350): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308) 
03-19 13:14:45.424: E/AndroidRuntime(350): at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
03-19 13:14:45.424: E/AndroidRuntime(350): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
03-19 13:14:45.424: E/AndroidRuntime(350): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
03-19 13:14:45.424: E/AndroidRuntime(350): at java.lang.Thread.run(Thread.java:1019) 
03-19 13:14:45.424: E/AndroidRuntime(350): Caused by: java.lang.OutOfMemoryError 
03-19 13:14:45.424: E/AndroidRuntime(350): at java.lang.String.<init>(String.java:513) 
03-19 13:14:45.424: E/AndroidRuntime(350): at org.kxml2.io.KXmlParser.get(KXmlParser.java:610) 
03-19 13:14:45.424: E/AndroidRuntime(350): at org.kxml2.io.KXmlParser.getText(KXmlParser.java:1280) 
03-19 13:14:45.424: E/AndroidRuntime(350): at org.ksoap2.serialization.SoapSerializationEnvelope.readUnknown(SoapSerializationEnvelope.java:256) 
03-19 13:14:45.424: E/AndroidRuntime(350): at org.ksoap2.serialization.SoapSerializationEnvelope.read(SoapSerializationEnvelope.java:422) 
03-19 13:14:45.424: E/AndroidRuntime(350): at org.ksoap2.serialization.SoapSerializationEnvelope.readUnknown(SoapSerializationEnvelope.java:289) 
03-19 13:14:45.424: E/AndroidRuntime(350): at org.ksoap2.serialization.SoapSerializationEnvelope.read(SoapSerializationEnvelope.java:422) 
03-19 13:14:45.424: E/AndroidRuntime(350): at org.ksoap2.serialization.SoapSerializationEnvelope.parseBody(SoapSerializationEnvelope.java:149) 
03-19 13:14:45.424: E/AndroidRuntime(350): at org.ksoap2.SoapEnvelope.parse(SoapEnvelope.java:137) 
03-19 13:14:45.424: E/AndroidRuntime(350): at org.ksoap2.transport.Transport.parseResponse(Transport.java:100) 
03-19 13:14:45.424: E/AndroidRuntime(350): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:195) 
03-19 13:14:45.424: E/AndroidRuntime(350): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:95) 
03-19 13:14:45.424: E/AndroidRuntime(350): at com.example.downloadfromwebserviceexample.WebService.GetAttachmentasbinary(WebService.java:157) 
03-19 13:14:45.424: E/AndroidRuntime(350): at com.example.downloadfromwebserviceexample.FieldActivity$AsyncCallWS2.doInBackground(FieldActivity.java:77) 
03-19 13:14:45.424: E/AndroidRuntime(350): at com.example.downloadfromwebserviceexample.FieldActivity$AsyncCallWS2.doInBackground(FieldActivity.java:1) 
03-19 13:14:45.424: E/AndroidRuntime(350): at android.os.AsyncTask$2.call(AsyncTask.java:185) 
03-19 13:14:45.424: E/AndroidRuntime(350): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 
03-19 13:14:45.424: E/AndroidRuntime(350): ... 4 more 
03-19 13:15:10.274: I/Process(350): Sending signal. PID: 350 SIG: 9 

我加入

android:largeHeap="true" 

以下錯誤在AndroidManifest.xml文件中。所以它增長了堆,但是存儲來自web服務的字節串的字符串變量超出了限制。

這裏有什麼解決方案?在org.kxml2.io java.lang.OutOfMemoryError :

我更新ksoap2-機器人組裝-3.2.0-JAR-與-dependencies.jar現在錯誤改爲

引起.KXmlParser.push(KXmlParser.java:626)

+1

一個9 MB字符串?看起來像一個XY問題;如果你解釋了你想要做什麼呢? – fge

+0

我的代碼正在處理小文件,而不適用於大文件。我希望它能夠處理大文件。 –

回答

1

你正在做這個錯誤的方式 - 如果你想傳輸大對象,使用直接的HTTP鏈接。這樣,您就可以直接將它們寫入到SD卡中,而不會在主內存中佔用其大小的倍數。

再一次,不要將它們作爲附件從Web服務發送,將它們作爲直接的http響應發送 - 我相信甚至有一種WS-*兼容的方式來指定它。

相關問題