2014-05-12 2 views
-2

json을 사용하여 mysql 서버에서 데이터를 가져 오는 앱을 작성 중입니다. 메모리 부족 오류를 처리하기 위해 지연로드를 구현했습니다. 잠시 동안 앱은 정상적으로 실행되었지만 이제는 메모리 오류가 다시 발생합니다. 이 시간은 데이터가 아닌 이미지에만 적용됩니다. 앱을 응답 상태로 유지하면서 데이터를 처리 할 수있는 방법이 있습니까? logcat 출력은 다음과 같습니다. -android에서 많은 양의 데이터를 처리하는 방법

05-12 09:42:50.271: E/AndroidRuntime(1093): FATAL EXCEPTION: AsyncTask #2 
05-12 09:42:50.271: E/AndroidRuntime(1093): Process: com.opaxlabs.salepurchase, PID: 1093 
05-12 09:42:50.271: E/AndroidRuntime(1093): java.lang.RuntimeException: An error occured while executing doInBackground() 
05-12 09:42:50.271: E/AndroidRuntime(1093):  at android.os.AsyncTask$3.done(AsyncTask.java:300) 
05-12 09:42:50.271: E/AndroidRuntime(1093):  at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
05-12 09:42:50.271: E/AndroidRuntime(1093):  at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
05-12 09:42:50.271: E/AndroidRuntime(1093):  at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
05-12 09:42:50.271: E/AndroidRuntime(1093):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
05-12 09:42:50.271: E/AndroidRuntime(1093):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
05-12 09:42:50.271: E/AndroidRuntime(1093):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
05-12 09:42:50.271: E/AndroidRuntime(1093):  at java.lang.Thread.run(Thread.java:841) 
05-12 09:42:50.271: E/AndroidRuntime(1093): Caused by: java.lang.OutOfMemoryError 
05-12 09:42:50.271: E/AndroidRuntime(1093):  at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:94) 
05-12 09:42:50.271: E/AndroidRuntime(1093):  at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:145) 
05-12 09:42:50.271: E/AndroidRuntime(1093):  at java.lang.StringBuffer.append(StringBuffer.java:219) 
05-12 09:42:50.271: E/AndroidRuntime(1093):  at com.opaxlabs.salepurchase.CustomHttpClient.executeHttpGet(CustomHttpClient.java:150) 
05-12 09:42:50.271: E/AndroidRuntime(1093):  at com.opaxlabs.salepurchase.AllItemsActivity$AsyncData.doInBackground(AllItemsActivity.java:106) 
05-12 09:42:50.271: E/AndroidRuntime(1093):  at com.opaxlabs.salepurchase.AllItemsActivity$AsyncData.doInBackground(AllItemsActivity.java:1) 
05-12 09:42:50.271: E/AndroidRuntime(1093):  at android.os.AsyncTask$2.call(AsyncTask.java:288) 
05-12 09:42:50.271: E/AndroidRuntime(1093):  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
05-12 09:42:50.271: E/AndroidRuntime(1093):  ... 4 more 

도움을 주시면 감사하겠습니다. 미리 감사드립니다.

편집 : 다음과 같은 오류가 발생 코드는 - 내가 전에 본 한

protected Item[] doInBackground(String... arg0) { 
      String str = null; 
      try { 
       str = CustomHttpClient.executeHttpGet(arg0[0]); 
       JSONArray array = new JSONArray(str); 
       item_data = new Item[array.length()]; 
       selectionId = new int[array.length()]; 

       for (int i = 0; i < item_data.length; i++) { 
        JSONObject jdata = array.getJSONObject(i); 
        String path = Constants.THUMBS + jdata.getString("name"); 
        int itemid = jdata.getInt("id"); 
        String cityid = jdata.getString("city_id"); 
        item_data[i] = new Item(itemid, cityid, path, 
          jdata.getString("title"), jdata.getString("price")); 
        selectionId[i] = jdata.getInt("subcategory_id");// change 
                    // the 
                    // field 
                    // name 
                    // here 
       } 

      } catch (JSONException j) { 

      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      return item_data; 
     } 
+1

@P이 오류가 발생한 곳의 코드를 입력하십시오. –

답변

2

. JSON 응답이 너무 커서 문자열에 배치 할 수 없습니다. 가능한 해결책은 두 가지가 있습니다.

1) 요청을 더 작게 만드십시오. 이것은 큰 JSON-RPC 응답으로이 문제를 접했을 때 내가 선택한 경로입니다. 제 경우에는 연속적인 ID로 데이터 저장소에서 레코드를로드했기 때문에 쉽습니다. 내가해야 할 일은 n 레코드에 id > x을 요청한 다음 서버가 데이터를 반환하지 않을 때까지 동일한 요청을 계속 유지하는 것입니다.

2) Jackson 또는 JsonReader과 같은 스트리밍 JSON 파서를 사용하십시오. 위의 (1)을 구현할 수 없다면 이것이 최선의 해결책 일 수도 있습니다.

1
This should be inside doinbackground 
     try 
     { 

      JSONObject json = new JSONObject(str_json); 
      JSONArray jsonArray = json.getJSONArray("user_list"); 
      if(jsonArray.length()>0) 
      { 
       for (int i = 0; i < jsonArray.length(); i++) 
       { 
        JSONObject jsonObject = jsonArray.getJSONObject(i); 
        responseContactList.add(jsonObject); 
       } 
       adapterContact = new myAdapterContact(ShareEvent.this, responseContactList);  
       return jsonArray.length(); 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

here the responseContactList is a global class level arraylist of jsonobjects 
and this should be in postexecute 
@Override 
    protected void onPostExecute(Integer result) { 
     super.onPostExecute(result); 
      if(result>0) 
      { 

listViewContact.setAdapter(adapterContact); 
} 

below is adapter 

private class myAdapterContact extends BaseAdapter 
{ 
LayoutInflater inflater; 
private ArrayList<JSONObject> data = new ArrayList<JSONObject>(); 
public myAdapterContact(Activity a, ArrayList<JSONObject> d) { 
data=d; 
inflater = LayoutInflater.from(a); 
} 
@Override 
public int getCount() { 
return data.size(); 
}  
and then in side getview method values should be set as on the textview 
holder.contact_name.setText (data.get(position).getString("display_name")); 
+0

이것은 훌륭한 대답이지만 'OutOfMemoryError'질문이나 주소와 일치하지 않습니다. StackOverflow에 오신 것을 환영합니다! – 323go

관련 문제