안드로이드 개발 질문/답변
(글 수 45,052)
제가 웹에서 이미지를 받아와서 리스트에 보여주는 건데.....
스크롤에 보이지 않을 때면 기본 이미지로 있다가 리스트에 보여지면 (getview 시작) 다시 이미지를 웹에서 받아옵니다...
그렇게 되니 잠시 내렸다 올렸다를 반복하면 화면에서 안보였다 보였다 할때마다 이미지를 계속 받아 오네요...
한번 받은 이미지는 다시 안받게 못하나요?
getView()
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View v = convertView;
if(v == null){
LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.data_list2, null);
}
TextView txtview = (TextView)v.findViewById(R.id.txt_data);
txtview.setText(data_storage.getM_Name().get(position));
ImageView imgview = (ImageView)v.findViewById(R.id.img);
ImageLoad downloader = new ImageLoad(imgview);
downloader.execute(ImageListgetURL("position);
return v;
}
AsyncTask..이미지 받아오는 곳....
public class ImageLoad extends AsyncTask<String, Void, Bitmap> {
private String url;
private final WeakReference<ImageView> imageViewReference;
public ImageLoad(ImageView imageview){
imageViewReference = new WeakReference<ImageView>(imageview);
}
@Override
protected Bitmap doInBackground(String... params) {
// TODO Auto-generated method stub
url = params[0];
try {
BufferedInputStream bis = new BufferedInputStream(new URL("url).openConnection().getInputStream());
Thread.sleep(200);
return BitmapFactory.decodeStream(bis);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
if(imageViewReference != null){
ImageView imageView = imageViewReference.get();
if(imageView != null)
//this image will be displayed before being completely loaded from server
imageView.setImageResource(R.drawable.icon);
}
}
@Override
protected void onPostExecute(Bitmap result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
if(imageViewReference != null){
ImageView imageView = imageViewReference.get();
if(imageView != null)
imageView.setImageBitmap(result);
}
}
}




캐시에 저장을 해야죠 메모리에 캐시하는 방법과 SDCARD에 넣는 방법중 택하거나 두개다 쓸 수도 있습니다.
구글 호환패키지에 보면 LRU캐시 유틸리티 클래스가 있으니까 이거 활용하세요