xml로 데이터를 리스트뷰에 뿌려주는 부분입니다

 

기본적으로 이미지 용량때문에 발생하는 메모리 부족 문제는 어느정도 팁으로 해결이 된 상태 입니다

 

메모리 문제는 아닌거 같구요

 

xml을 변경한 것은 있는데 그게 문제인지는 잘 모르겠습니다

 

변경하기 전에는 몇백개씩 리스트가 떴구요

 

희않하게 140개 넘어가면 오류가 발생하는데

 

xml 불러올때 조건을 달리주어 다른 데이터를 가지고 오도록 하면 문제가 없네요 xml 에서 가지온 데이터 자체가 문제인지는

 

잘 모르겠습니다 xml 파일 자체 오류도 없구요

 

고수님들의 친절하신 답변 부탁 드립니다

 

 

에러 로그 입니다

08-17 18:07:53.890: W/dalvikvm(16504): threadid=1: thread exiting with uncaught exception (group=0x4001e578)
08-17 18:07:53.914: E/AndroidRuntime(16504): FATAL EXCEPTION: main
08-17 18:07:53.914: E/AndroidRuntime(16504): java.lang.NullPointerException
08-17 18:07:53.914: E/AndroidRuntime(16504):  at my.realtyServe.Pkg.ServeMaemulListActTemp$GoodListAdapter.getView(ServeMaemulListActTemp.java:250)
08-17 18:07:53.914: E/AndroidRuntime(16504):  at android.widget.HeaderViewListAdapter.getView(HeaderViewListAdapter.java:220)
08-17 18:07:53.914: E/AndroidRuntime(16504):  at android.widget.AbsListView.obtainView(AbsListView.java:1567)
08-17 18:07:53.914: E/AndroidRuntime(16504):  at android.widget.ListView.makeAndAddView(ListView.java:1770)
08-17 18:07:53.914: E/AndroidRuntime(16504):  at android.widget.ListView.fillDown(ListView.java:693)
08-17 18:07:53.914: E/AndroidRuntime(16504):  at android.widget.ListView.fillSpecific(ListView.java:1325)
08-17 18:07:53.914: E/AndroidRuntime(16504):  at android.widget.ListView.layoutChildren(ListView.java:1599)
08-17 18:07:53.914: E/AndroidRuntime(16504):  at android.widget.AbsListView.onLayout(AbsListView.java:1418)
08-17 18:07:53.914: E/AndroidRuntime(16504):  at android.view.View.layout(View.java:7228)
08-17 18:07:53.914: E/AndroidRuntime(16504):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254)
08-17 18:07:53.914: E/AndroidRuntime(16504):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130)
08-17 18:07:53.914: E/AndroidRuntime(16504):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1047)
08-17 18:07:53.914: E/AndroidRuntime(16504):  at android.view.View.layout(View.java:7228)
08-17 18:07:53.914: E/AndroidRuntime(16504):  at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
08-17 18:07:53.914: E/AndroidRuntime(16504):  at android.view.View.layout(View.java:7228)
08-17 18:07:53.914: E/AndroidRuntime(16504):  at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
08-17 18:07:53.914: E/AndroidRuntime(16504):  at android.view.View.layout(View.java:7228)
08-17 18:07:53.914: E/AndroidRuntime(16504):  at android.view.ViewRoot.performTraversals(ViewRoot.java:1145)
08-17 18:07:53.914: E/AndroidRuntime(16504):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1865)
08-17 18:07:53.914: E/AndroidRuntime(16504):  at android.os.Handler.dispatchMessage(Handler.java:99)
08-17 18:07:53.914: E/AndroidRuntime(16504):  at android.os.Looper.loop(Looper.java:130)
08-17 18:07:53.914: E/AndroidRuntime(16504):  at android.app.ActivityThread.main(ActivityThread.java:3698)
08-17 18:07:53.914: E/AndroidRuntime(16504):  at java.lang.reflect.Method.invokeNative(Native Method)
08-17 18:07:53.914: E/AndroidRuntime(16504):  at java.lang.reflect.Method.invoke(Method.java:507)
08-17 18:07:53.914: E/AndroidRuntime(16504):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
08-17 18:07:53.914: E/AndroidRuntime(16504):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
08-17 18:07:53.914: E/AndroidRuntime(16504):  at dalvik.system.NativeStart.main(Native Method)

package my.realtyServe.Pkg;

 

import giil.xml.Document;
import giil.xml.ElemList;
import giil.xml.Element;
import giil.xml.XmlParser;

import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.*;

import my.realtyServe.Pkg.ServeMaemulListAct.GoodData;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;


import android.annotation.SuppressLint;
import android.app.*;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.*;
import android.util.*;
import android.view.*;
import android.widget.*;
import android.widget.AbsListView.OnScrollListener;

@SuppressWarnings("unused")
public class ServeMaemulListActTemp extends Activity {
    /** Called when the activity is first created. */
 public  int      itemNum = 0;
 public  int      pageNum = 1;
 public  int      totalListNum;
 public  GoodListAdapter   mAdapter;
 public  TextView     mTestText;
 public  LinearLayout   mTestLayout;
 public  ArrayList<GoodData>  arrItems;
 public  GoodData     mi;
 public  String      mResult;
 private ListView     mListView;
 private boolean     mLockListView;
 public Intent      intent; 
 public GoodViewHolder    viewHolder;
 public LocationHelper    locationHelper;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.servemaemullist);
        mLockListView  = false;
        arrItems   = new ArrayList<GoodData>();
        mAdapter   = new GoodListAdapter(this, R.layout.gooditem, arrItems);
        mListView   = (ListView) findViewById(R.id.list);
        mTestLayout  = (LinearLayout) View.inflate(this, R.layout.progressloading, null);
        Log.v("testLog", "Start");
        mTestLayout.setVisibility(View.INVISIBLE);
        mListView.addFooterView(mTestLayout);
        mListView.setAdapter(mAdapter);
       
        mListView.setOnScrollListener(new OnScrollListener() {
   
   // @Override
   public void onScrollStateChanged(AbsListView view, int scrollState) {
    // TODO Auto-generated method stub
    
   }
   
   // @Override
   public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {
    // TODO Auto-generated method stub
    Log.v("testLog", "Start_onScroll");
    Log.v("testLog", "첫번째 firstVisibleItem = " + firstVisibleItem);
    Log.v("testLog", "뷰내에 보이는 아이템 visibleItemCount = " + visibleItemCount);
    Log.v("testLog", "총 아이템수totalItemCount = " + totalItemCount);
    
    
    int count = totalItemCount - visibleItemCount;
    Log.v("testLog", "count = " + count);
    
    if(firstVisibleItem >= count && totalItemCount != 0 && mLockListView == false){
     Log.v("testLog", "excuteGetMoreItems");
     mTestLayout.setVisibility(View.VISIBLE);
     new getMoreItems().execute(arrItems); 
    }
    else{
     Log.v("testLog", "dontExcuteGetMoreItems");
     mTestLayout.setVisibility(View.INVISIBLE);
    }
     

   }
  });       
    }
   
    private class getMoreItems extends AsyncTask<ArrayList<GoodData>, Integer, Long> {

  @Override
  protected Long doInBackground(ArrayList<GoodData>... params) {
   // TODO Auto-generated method stub
   Long result = 0L;
      
   boolean initem = false;
   mLockListView = true;
   String imageUrl = "";
   String goodcat2_name = "";
   String goodtype_name = "";
   String strGoodName = "";
   String goodTitle = "";
   String zipaddr1 = "";
   String zipaddr2 = "";
   String salePrice = "";
   String rentPrice = "";
   String monthPrice = "";
   String goodSpace = "";

   
   
   try {
    //Log.v("locaiton", ":"+locationHelper.getLat());
    pageNum +=1;
    Log.v("pagenum", ":"+pageNum);
    URL url = new URL("http://m.serve.co.kr/inc/lbs_maemul_xml.asp?pagesize=20&page="+pageNum); //실제 xml을 받을수 있는 경로..
    URLConnection uc = url.openConnection();
    Document doc = new XmlParser().parse(uc.getInputStream());
    
    Element maemulXml = doc.getRootElement();
    ElemList items = maemulXml.getChild("good").getChildren();
    for(int i = 0; i < items.size(); i++) {
     itemNum +=1;
        Element item  = items.get(i);
       
        imageUrl   = item.getChild("image").getText();       
        goodcat2_name  = item.getChild("goodcat2_name").getText();      
        goodtype_name  = item.getChild("goodtype_name").getText();      
        strGoodName  = item.getChild("goodName").getText();        
        goodTitle   = item.getChild("goodTitle").getText();          
        zipaddr1  = item.getChild("zipaddr1").getText();           
        zipaddr2   = item.getChild("zipaddr2").getText();           
        salePrice   = item.getChild("salePrice").getText();          
        rentPrice   = item.getChild("rentPrice").getText();          
        monthPrice   = item.getChild("monthPrice").getText();         
        goodSpace   = item.getChild("goodSpace").getText();          
       
       
     
     Log.v("xmldata", itemNum+") <"+item.getAttributeValue("good_id")+"> "+strGoodName+ " : "+imageUrl);
     mi = new GoodData(imageUrl, itemNum+")"+strGoodName);
     arrItems.add(mi);
    }


   }
   catch (Exception ex) {;}
   
   //try { Thread.sleep(3000); } catch (Exception e) { ; } // 3초 지연. 네트워크 작업 등을 시뮬레이션
   // dialog.dismiss();
   // URL 지정
   
   return null;
  }
  
  
 
  protected void onPostExecute(Long result){
   mAdapter.notifyDataSetChanged();
   mLockListView = false;

            // 작업이 완료 된 후 할일
            // dialog.dismiss();
            // super.onPostExecute(result);
  }
  /*
        private ProgressDialog dialog;
       
  protected void onPreExecute() {
            // 작업을 시작하기 전 할일
            dialog = new ProgressDialog(Main.this);
            dialog.setTitle("Indeterminate");
            dialog.setMessage("Please wait while loading...");
            dialog.setIndeterminate(true);
            dialog.setCancelable(true);
            dialog.show();
            super.onPreExecute();
        }
  */
    }
   
    class GoodListAdapter extends BaseAdapter {
     Context maincon;
     LayoutInflater Inflater;
     ArrayList<GoodData> arrItems;
     int layout;
     private final ImageDownloader imageDownloader = new ImageDownloader();
   
     private List<WeakReference<View>> mRecycleList = new ArrayList<WeakReference<View>>();
     
     

     public GoodListAdapter(Context context, int alayout, ArrayList<GoodData> arItems) {
      maincon  = context;
      Inflater  = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      arrItems  = arItems;
      layout   = alayout;
     }

     public int getCount() {
      return arrItems.size();
     }

     public String getItem(int position) {
      return arrItems.get(position).goodName;
     }

     public long getItemId(int position) {
      return position;
     }

     // 각 항목의 뷰 생성
     @SuppressLint("NewApi")
  public View getView(int position, View convertView, ViewGroup parent) {
      final int pos = position;
      String imageUrl = "";
      
      
      if (convertView == null) {
       
       convertView  = Inflater.inflate(layout, parent, false);
       viewHolder   = new GoodViewHolder();
       viewHolder.vGoodImage  = (ImageView) convertView.findViewById(R.id.img);
       viewHolder.vGoodName  = (TextView) convertView.findViewById(R.id.text);
       //viewHolder.vOrderBtn  = (Button) convertView.findViewById(R.id.btn);
       
       convertView.setTag(viewHolder);
      } 
      else{ 
       viewHolder = (GoodViewHolder) convertView.getTag();
      }
      
      imageUrl = arrItems.get(position).goodImage;
      
      if(imageUrl.equals("") == false){
       imageUrl = "http://image.serve.co.kr/get_serve_image.asp?file_w=142&file_h=105&file="+imageUrl;
      }
      
      Log.v("locaiton", ":"+arrItems.get(position).goodName);
      Log.v("locaiton", ":"+imageUrl);
   imageDownloader.download(Base64.encode(imageUrl.getBytes(), 0), viewHolder.vGoodImage);
      
      viewHolder.vGoodName.setText(arrItems.get(position).goodName);
      /*
      viewHolder.vOrderBtn.setOnClickListener(new Button.OnClickListener(){
    public void onClick(View v) {
     String str = arrItems.get(pos).goodName + "를 주문합니다.";
     Toast.makeText(maincon, str, Toast.LENGTH_SHORT).show();
    }
   });;
   */ 
      
      return convertView;
     }
     
     public ImageDownloader getImageDownloader()
     {
      return imageDownloader;
     }

  public void recycle() {
   for (WeakReference<View> ref : mRecycleList) {
    RecycleUtils.recursiveRecycle(ref.get());
    }
  }
    }
   
    class GoodData {
     GoodData(String vGoodImage, String vGoodName){
      goodImage  = vGoodImage;
      goodName = vGoodName;
     }
     
     String goodImage;
     String goodName;
    }
   
    public class GoodViewHolder
    {
     public ImageView vGoodImage;
     public TextView  vGoodName;
     public Button  vOrderBtn;
    }
         
   
    public void onPause(){
     super.onPause();
     Log.v("testLog", "onPause");
    }
 protected void onDestroy() {
  Log.v("testLog", "onDestroy");
  //Adapter가 있으면 어댑터에서 생성한 recycle메소드를 실행
  if (mAdapter != null){
   mAdapter.recycle();
  } 
  RecycleUtils.recursiveRecycle(getWindow().getDecorView());
  System.gc();

  super.onDestroy();
 
 }
 
 
    public boolean onKeyDown(int keyCode, KeyEvent event) {
     
        if ((keyCode == KeyEvent.KEYCODE_BACK)){
         intent = new Intent(ServeMaemulListActTemp.this,ServeWebAct.class);
   intent.putExtra("linkUrl", "http://m.serve.co.kr/m2/");
   startActivity(intent);
   finish();
         
        } 
        return super.onKeyDown(keyCode, event);

    }
   
    public boolean onCreateOptionsMenu(Menu menu) {
        // 액티비티에서 XML 형식으로 구성된 메뉴를 실제 사용 가능한 Options Menu 로
        // 재구성하게 해주는 MenuInflater 객체를 얻는다.
        MenuInflater inflater = getMenuInflater();

        // XML 형식으로 구성된 메뉴를 사용 가능한 Options Menu 로 재구성한다.
        inflater.inflate(R.menu.main_menu, menu);
        return true;
    }
    public boolean onOptionsItemSelected(MenuItem item) {
        // 텍스트뷰를 얻는다.
      
        switch (item.getItemId()) {
            case R.id.menu_1:
             intent = new Intent(ServeMaemulListActTemp.this,ServeWebAct.class);
    intent.putExtra("linkUrl", "http://m.serve.co.kr/m2/all.asp");
    startActivity(intent);
    finish();
             return true;
            case R.id.menu_2:
             intent = new Intent(ServeMaemulListActTemp.this,ServeMaemulListActTemp.class);
             startActivity(intent);
       finish();
                return true;
            case R.id.menu_3:
             Toast.makeText(ServeMaemulListActTemp.this, "프로그램을 종요합니다!", Toast.LENGTH_SHORT).show();
             finish();
             return true;
            default :
                // 사용자가 선택에 대한 처리를 완료하지 못하면 false 를 반환해도 되지만
                // 바로 false 를 반환하지 않고, 슈퍼 클래스의 onOptionsItemSelected메소드를
                // 하여 해당 메소드가 반환하는 반환값을 반환해주는 것이 좋습니다.
                return super.onOptionsItemSelected(item);
        }
    }
}