我ahve做同步SQL服務器& sqlite.While這樣做,我得到了OutOfMemoryError.Please告訴我我們如何可以避免或從我的代碼是否有任何不需要或獲得更多內存聲明在那裏?請指導我。我可以在哪裏使用System.gc()
?雖然同步的SQL服務器和android的sqlite:我得OutOfMemoryError
從服務結果來的字符串作爲JSON。
{"Table1" :
[{"ActiveStatus" : "1","AddressLine1" : "223, Dambulla Road,","AddressLine2" : "Galewela.","AddressLine3" : "","AlphaSearchCode" : "New Lanka Hardware -","BusinessUnit" : "MASS","ContactName" : "","CreatedBy" : "Nazar ","CreatedOn" : "Oct 3 2005 6:16PM","CreditLimit" : "100.00","CurrencyCode" : " ","CurrencyProcessingRequired" : "0","CurrentBalance" : "0.00","EMailAddress" : "","FaxNumber" : "","LastInvoiceDate" : "","LastPaymentDate" : "","LastPaymentValue" : "0.00","NewRetailerFlag" : "","OSOrdersPendingBase" : "0.00","OSOrdersPendingCurr" : "0.00","OnStopFlag" : "0","OnStopReasonCode" : " ","PaymentMethodCode" : "CQ","PriceGroup" : "MKT ","PricingMethod" : "0","RetailerCategoryCode" : "01 ","RetailerClassCode" : "C ","RetailerCode" : "0001 ","RetailerCodeSon" : " ","RetailerName" : "New Lanka Hardware - Galewela","RetailerTypeCode" : "02 ","RetailerTypeFlag" : "0","SalesExecutiveCode" : "THPOS ","SalesType" : "","SettlementTermsCode" : "C90","ShortAddress" : "Galewela11","StatusFlag" : "0","TelephoneNumber" : "","TempCreditApprovedInvNo" : "","TemporaryCreditAllowed" : "","TemporaryCreditApprovedBy" : "","TemporaryCreditApprovedOn" : "","TemporaryCreditLimit" : "0.00","TemporaryCreditUpto" : "","TerritoryCode" : "0001","TotalCreditsNotAllocated" : "0.00","TownCode" : "GW ","TradeSchemeGroup" : "DS ","VATCode" : "V0","VATRegistrationNo" : ""}]}
這是一個recored.Real時候它會1000以上records.After得到這個JSON因此,要使UPDATE語句或INSERT語句。
我不喜歡這種方式編碼:
public void loadDownloadData() {
SoapPrimitive responsePrimitiveData;
//Loop Table list
for (int i = 0; i < SelectedTablesName.size(); i++) {
try {
responsePrimitiveData = soapPrimitiveData(SelectedTablesName.get(i));
if (responsePrimitiveData != null) {
try {
String result = responsePrimitiveData.toString();
if(!result.equals("0")){
JSONObject jsonobject = new JSONObject(result);
JSONArray array = jsonobject.getJSONArray("Table1");
int max = array.length();
String actualtable = getAndroidTablename(SelectedTablesName.get(i));
String updateType = getTableUpdateType(SelectedTablesName.get(i));
boolean isRecordAvailable = isTableRecords(SelectedTablesName.get(i));
String[] strWhereField = getTablePrimaryKey(SelectedTablesName.get(i),strBusinessUnit);
if (updateType.equals("1")) {
// Loop each table data
for (int j = 0; j < max; j++) {
JSONObject obj = array.getJSONObject(j);
JSONArray names = obj.names();
StringBuffer strFields = new StringBuffer();
//StringBuffer strValues = new StringBuffer();
String[] strToFields = new String[names.length()];
String[] strToFieldsVal = new String[names.length()];
// getting the Json name, values in separate string array
for (int k = 0; k < names.length(); k++) {
strToFields[k] = names.getString(k);
if (obj.getString(names.getString(k)) == null) {
strToFieldsVal[k] = "";
} else {
if (obj.getString(names.getString(k)).equals(" ")) {
strToFieldsVal[k] = "";
} else {
strToFieldsVal[k] = obj.getString(names.getString(k)).replaceAll("\\s+", "");
}
}
strFields.append(names.getString(k) + ",");
} // end of json for loop
strFields.deleteCharAt(strFields.length() - 1);
if (isRecordAvailable) {
String[] strWhereFieldVal = new String[strWhereField.length];
StringBuffer whereFields = new StringBuffer();
// making update calues where part
for (int a = 0; a < strWhereField.length; a++) {
strWhereFieldVal[a] = obj.getString(strWhereField[a]);
String whereValues = obj.getString(strWhereField[a]).replaceAll("\\s+", "");
whereFields.append(strWhereField[a]+ "= '" + whereValues+ "' and ");
}
// removing "and" from the end
whereFields.delete(whereFields.length() - 4,whereFields.length());
updateTableRecords(actualtable,strToFields, strToFieldsVal, whereFields.toString(),strWhereFieldVal);
} else {
insertTableRecords(actualtable,strToFields, strToFieldsVal);
}
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
}
//Log.i("***" ,SelectedTablesName.get(i));
System.out.println(" -- " + SelectedTablesName.get(i));
try {
updateSuccessfulTableSoap(SelectedTablesName.get(i));
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
}
}
}
,我們怎樣才能做到垃圾收集這兒過得要使它字符串,字符串[],StringBuilder的參考爲空或我可以爲此做些什麼。
錯誤是:
08-11 17:26:53.040: ERROR/AndroidRuntime(348): FATAL EXCEPTION: AsyncTask #2
08-11 17:26:53.040: ERROR/AndroidRuntime(348): java.lang.RuntimeException: An error occured while executing doInBackground()
08-11 17:26:53.040: ERROR/AndroidRuntime(348): at android.os.AsyncTask$3.done(AsyncTask.java:200)
08-11 17:26:53.040: ERROR/AndroidRuntime(348): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
08-11 17:26:53.040: ERROR/AndroidRuntime(348): at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
08-11 17:26:53.040: ERROR/AndroidRuntime(348): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
08-11 17:26:53.040: ERROR/AndroidRuntime(348): at java.util.concurrent.FutureTask.run(FutureTask.java:138)
08-11 17:26:53.040: ERROR/AndroidRuntime(348): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
08-11 17:26:53.040: ERROR/AndroidRuntime(348): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
08-11 17:26:53.040: ERROR/AndroidRuntime(348): at java.lang.Thread.run(Thread.java:1019)
08-11 17:26:53.040: ERROR/AndroidRuntime(348): Caused by: java.lang.OutOfMemoryError
08-11 17:26:53.040: ERROR/AndroidRuntime(348): at java.nio.CharBuffer.put(CharBuffer.java:532)
08-11 17:26:53.040: ERROR/AndroidRuntime(348): at java.nio.charset.CharsetDecoder.allocateMore(CharsetDecoder.java:263)
08-11 17:26:53.040: ERROR/AndroidRuntime(348): at java.nio.charset.CharsetDecoder.decode(CharsetDecoder.java:218)
08-11 17:26:53.040: ERROR/AndroidRuntime(348): at java.nio.charset.Charset.decode(Charset.java:488)
08-11 17:26:53.040: ERROR/AndroidRuntime(348): at java.lang.String.<init>(String.java:181)
08-11 17:26:53.040: ERROR/AndroidRuntime(348): at java.lang.String.<init>(String.java:141)
08-11 17:26:53.040: ERROR/AndroidRuntime(348): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:96)
08-11 17:26:53.040: ERROR/AndroidRuntime(348): at com.xont.controller.DownlaodTableActivity.soapPrimitiveData(DownlaodTableActivity.java:640)
08-11 17:26:53.040: ERROR/AndroidRuntime(348): at com.xont.controller.DownlaodTableActivity.loadDownloadData(DownlaodTableActivity.java:247)
08-11 17:26:53.040: ERROR/AndroidRuntime(348): at com.xont.controller.DownlaodTableActivity$BackgroundAsyncTask.doInBackground(DownlaodTableActivity.java:795)
08-11 17:26:53.040: ERROR/AndroidRuntime(348): at com.xont.controller.DownlaodTableActivity$BackgroundAsyncTask.doInBackground(DownlaodTableActivity.java:1)
08-11 17:26:53.040: ERROR/AndroidRuntime(348): at android.os.AsyncTask$2.call(AsyncTask.java:185)
08-11 17:26:53.040: ERROR/AndroidRuntime(348): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
編輯
這是JSON處理
public void getSoapResponseTableDataJson(SoapPrimitive node,
ArrayList<String> strings ,String loadedtable) throws JSONException {
String result = node.toString();
JSONObject jsonobject = new JSONObject(result);
JSONArray array = jsonobject.getJSONArray("Table1");
int max = array.length();
HashMap<String, String> applicationSettings = new HashMap<String,String>();
for(int i = 0; i < max; i++){
String value = array.getJSONObject(i).getString("value");
String name = array.getJSONObject(i).getString("name");
applicationSettings.put(name, value);
}
}
請幫我如何獲得這個解決方案....
提前致謝。
這是很好的建議。但我的情況下,響應即將到來的字符串json,這意味着'{「Table1」:[{「ActiveStatus」:「1」,「AddressLine1」}]}'像這樣。我們如何使用'HttpResponse.getEntity'&'HttpEntity.getContent'請指導我... – Piraba
我不熟悉您使用的SOAP庫。在這種情況下,您可能正在使用'ServiceConnection.openInputStream' –