我想獲取字符串字符串,並希望將其轉換爲PDF應用程序,並顯示該PDF。java.lang.String的9431460字節分配內存不足。 <init> android
我在sdcard中寫入字節。
Web服務正在使用ksoap2-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)
一個9 MB字符串?看起來像一個XY問題;如果你解釋了你想要做什麼呢? – fge
我的代碼正在處理小文件,而不適用於大文件。我希望它能夠處理大文件。 –