2012-07-02 8 views
0

JSON 응답에서 데이터를 수신하는 데 문제가 있으며 데이터에도 많은 이미지가 있습니다. 100 개 이상의 데이터가 너무 많습니다. 따라서 LazyAdapter에서로드하려고하거나 LazyAdapter의 NotifydatasetChanged 메소드를 호출하려고 할 때 OutOfmemory 예외를 반환합니다. 이와 관련하여 어떤 해결책을 제안하십시오.Android App에서 OutOfMemory 예외가 발생합니다.

코드 :

final ProgressDialog dialog = ProgressDialog.show(
        ResearchList.this, "Research List  ", 
        "Please wait... ", true); 

      final Handler handler = new Handler() { 

       public void handleMessage(Message msg) { 

        // System.out.println("The id after Save:"+id.get(0).toString()); 

        // catagory.addAll(keyword_vector1); 
        linear_Category_Child.setVisibility(View.GONE); 
        linear_Category_Child_Child.setVisibility(View.VISIBLE); 
        //tv_Child_Header.setText("Volvo"); 
        tv_CategoryChildHeader.setText(from); 
        setHeaderImage(tv_CategoryChildHeader.getText().toString()); 

        if(coll.getDisplayNames().size()!=0) 
        { 
         adapter = new CategoryListLazyAdapter(
           ResearchList.this); 
         lvCategory.setAdapter(adapter); 
         Utility util = new Utility(); 
         util.setListViewHeightBasedOnChildren(lvCategory); 

        } 
        else 
        { 
         /*lvCategory.invalidate(); 
         lvCategory.setAdapter(null);*/ 
         AlertDialog.Builder builder = new Builder(ResearchList.this); 
         builder.setTitle("Attention!"); 
         builder.setMessage("No Data Available for the Particular Search."); 
         builder.setPositiveButton("OK", 
           new DialogInterface.OnClickListener() { 

            @Override 
            public void onClick(DialogInterface dialog, int which) { 
             // TODO Auto-generated method stub 

            } 
           }); 

         builder.create().show(); 
        } 
        /*Utility util = new Utility(); 
        util.setListViewHeightBasedOnChildren(lvCategory);*/ 
        dialog.dismiss(); 
       } 
      }; 

      final Thread checkUpdate = new Thread() { 

       public void run() { 
        try { 
         String sortEncode = URLEncoder.encode("mpg"); 
         String filterEncode = URLEncoder.encode(filter); 
         String clientEncode = URLEncoder.encode("10030812"); 
         String fromEncode = URLEncoder.encode(from); 
         String toEncode = URLEncoder.encode(to); 
         String catUrl = "/v1/vehicles/get-make-models.json?sort=" 
           + sortEncode 
           + "&filter=" 
           + filterEncode 
           + "&client-id=" 
           + clientEncode 
           + "&from=" 
           + fromEncode; 
         genSig = new GetSignature(catUrl, "acura"); 
         try { 
          signature = genSig.getUrlFromString(); 
         } catch (InvalidKeyException e1) { 
          // TODO Auto-generated catch block 
          e1.printStackTrace(); 
         } catch (NoSuchAlgorithmException e1) { 
          // TODO Auto-generated catch block 
          e1.printStackTrace(); 
         } 
         // jsonString = 
         // getJsonSring("http://api.highgearmedia.com/v1/vehicles/get-models.json?make=acura&client-id=10030812&signature=LWQbdAlJVxlXZ1VO2mfqAA=="); 
         // String signatureEncode = 
         // URLEncoder.encode(signature); 
         String urlEncode = URLEncoder.encode(catUrl 
           + "&signature=" + signature); 
         jsonString = getJsonSring("http://apibeta.highgearmedia.com" 
           + catUrl + "&signature=" + signature); 
         System.out.println("The json category:===>" 
           + jsonString); 
        } catch (ClientProtocolException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } catch (URISyntaxException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        JsonParse json = new JsonParse(jsonString); 
        json.parseCat(); 
        LIST_SIZE = coll.getDisplayNames().size(); 
        for (int i = 0; i <= BATCH_SIZE; i++) { 
         // countriesSub.add(COUNTRIES[i]); 
         countriesSubCat.add(coll.getDisplayNames().get(i)); 
         imagesSubCat.add(coll.getImages().get(i)); 
         YearSubCat1.add(coll.getYears().get(i)); 
         YearSubCat2.add(coll.getYears().get(i + 1)); 
         mpgSubCat1.add(coll.getMpg().get(i)); 
         mpgSubCat2.add(coll.getMpg().get(i + 1)); 
         priceSubCat1.add(coll.getPrice().get(i)); 
         priceSubCat2.add(coll.getPrice().get(i + 1)); 
         ratingSubCat1.add(coll.getRating().get(i)); 
         ratingSubCat2.add(coll.getRating().get(i + 1)); 
        } 
        setLastOffset(BATCH_SIZE); 
        handler.sendEmptyMessage(0); 

       } 

      }; 
      checkUpdate.start(); 

GetJSonString 방법 (오류 장소) :

public String getJsonSring(String api_url) throws URISyntaxException, 
      ClientProtocolException, IOException { 
     try { 
      HttpClient client = new DefaultHttpClient(); 
      HttpGet request = new HttpGet(); 
      URL url = new URL(api_url); 
      URI uri = new URI(url.getProtocol(), url.getHost(), url.getPath(), 
        url.getQuery(), null); 
      request.setURI(uri); 

      HttpResponse response = client.execute(request); 
      InputStream ips = response.getEntity().getContent(); 
      BufferedReader buf = new BufferedReader(new InputStreamReader(ips, "UTF-8")); 




      StringBuilder sb = new StringBuilder(); 
      String s; 
      while (true) { 
       s = buf.readLine(); 
       if (s == null || s.length() == 0) 
        break; 
       sb.append(s); 

      } 
      buf.close(); 
      ips.close(); 
      return sb.toString(); 

     } 

     finally { 
      // any cleanup code... 
     } 

    } 

답변

0

문제는 너무 커서, 이는 한 번에 전체 JSON 피드를 구문 분석하는 것입니다 기억에 남기십시오. Jackson과 같은 JSON 스트림 파서를 사용합니다 (이는 매우 빠릅니다). 서버에서 피드를 가져올 때 JSON 객체를 구문 분석 할 수 있습니다.

이미지를 구문 분석 할 때 이미지를 디스크로 덤프하여 메모리를 비우고 적당하다고 생각되면 다시로드합니다.

관련 문제