안드로이드 개발 질문/답변
(글 수 45,052)
ListView 사용하는 경우 List 보여주는 로딩 시간이 생각보다 긴거 같습니다.
제가 리스트 데이터를 가져오는 대상이 웹서버에서 가져오는 부분이기때문에 그럴수도 있다고 생각하는 데요
그런데 에뮬에서도 리스트를 가져오는 시간이 느리다면, 정확히 어떤 부분에서 시간이 많이 소모하는지 알 필요가 있다고 생각합니다.
아래는 제가 만든 리스트 어댑터입니다. 혹시 어댑터에서 시간을 소모하는 부분이 있는 지 봐주셨으면 합니다.
package com.project.adapter;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.project.R;
import com.project.model.ListData;
public class CustomerAdapter extends ArrayAdapter<ListData> {
private ArrayList<ListData> items;
public CustomerAdapter(Context context, int textViewResourceId,
ArrayList<ListData> items) {
super(context, textViewResourceId, items);
this.items = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
Log.i("convertView", " = null ");
LayoutInflater vi = (LayoutInflater) getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.row, null);
}
Log.i("postion", " = " + position);
ListData p = items.get(position);
if (p != null) {
TextView tt = (TextView) v.findViewById(R.id.label);
TextView bt = (TextView) v.findViewById(R.id.TextView01);
ImageView imgview = (ImageView) v.findViewById(R.id.icon);
if (tt != null) {
tt.setText(p.getName());
}
if (bt != null) {
bt.setText(p.getContent());
}
if(imgview != null && p.getUrl() != null) {
imgview.setImageBitmap( downloadFile( p.getUrl() ) );
}
}
return v;
}
public Bitmap downloadFile(String fileUrl) {
URL myFileUrl = null;
try {
myFileUrl = new URL(fileUrl);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
try {
HttpURLConnection conn = (HttpURLConnection) myFileUrl
.openConnection();
conn.setDoInput(true);
conn.connect();
int length = conn.getContentLength();
InputStream is = conn.getInputStream();
Bitmap bmImg = BitmapFactory.decodeStream(is);
return bmImg;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
}
제가 리스트 데이터를 가져오는 대상이 웹서버에서 가져오는 부분이기때문에 그럴수도 있다고 생각하는 데요
그런데 에뮬에서도 리스트를 가져오는 시간이 느리다면, 정확히 어떤 부분에서 시간이 많이 소모하는지 알 필요가 있다고 생각합니다.
아래는 제가 만든 리스트 어댑터입니다. 혹시 어댑터에서 시간을 소모하는 부분이 있는 지 봐주셨으면 합니다.
package com.project.adapter;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.project.R;
import com.project.model.ListData;
public class CustomerAdapter extends ArrayAdapter<ListData> {
private ArrayList<ListData> items;
public CustomerAdapter(Context context, int textViewResourceId,
ArrayList<ListData> items) {
super(context, textViewResourceId, items);
this.items = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
Log.i("convertView", " = null ");
LayoutInflater vi = (LayoutInflater) getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.row, null);
}
Log.i("postion", " = " + position);
ListData p = items.get(position);
if (p != null) {
TextView tt = (TextView) v.findViewById(R.id.label);
TextView bt = (TextView) v.findViewById(R.id.TextView01);
ImageView imgview = (ImageView) v.findViewById(R.id.icon);
if (tt != null) {
tt.setText(p.getName());
}
if (bt != null) {
bt.setText(p.getContent());
}
if(imgview != null && p.getUrl() != null) {
imgview.setImageBitmap( downloadFile( p.getUrl() ) );
}
}
return v;
}
public Bitmap downloadFile(String fileUrl) {
URL myFileUrl = null;
try {
myFileUrl = new URL(fileUrl);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
try {
HttpURLConnection conn = (HttpURLConnection) myFileUrl
.openConnection();
conn.setDoInput(true);
conn.connect();
int length = conn.getContentLength();
InputStream is = conn.getInputStream();
Bitmap bmImg = BitmapFactory.decodeStream(is);
return bmImg;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
}
코드 중간 중간에 시간측정하는 코드 넣어서 직접 측정해 보셔야 할듯합니다.
안드로이드의 갤러리 소스 보면, 썸네일을 직접 로딩하지 않고, 쓰레드 만들어서 로딩을 시키더라구요.
물론 이쪽은 listview는 아닙니다.