2011-08-11 39 views
0

我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); 
      } 



    } 

請幫我如何獲得這個解決方案....

提前致謝。

回答

2

您正在使用大量內存從服務器響應中形成JSON對象。這是因爲Android附帶的標準JSON庫使用整個響應來形成JSON對象樹。

當您處理大量數據(以避免OutOfMemoryError)時,您需要在從輸入流中讀取JSON對象時依次形成JSON對象。看看Jackson,它可以讓你解析流中的JSON,大大減少內存消耗。

當您收到從服務器使用HttpResponse.getEntity的響應,以獲得HttpEntity的保持上,您可以撥打HttpEntity.getContent得到一個InputStream

+1

這是很好的建議。但我的情況下,響應即將到來的字符串json,這意味着'{「Table1」:[{「ActiveStatus」:「1」,「AddressLine1」}]}'像這樣。我們如何使用'HttpResponse.getEntity'&'HttpEntity.getContent'請指導我... – Piraba

+0

我不熟悉您使用的SOAP庫。在這種情況下,您可能正在使用'ServiceConnection.openInputStream' –

相關問題