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