외부 라이브러리 없이 AsyncTask를 이용해 이미지를 다운받아보는 예제
다운로드 할 이미지 주소(네이버-앤트맨과 와스프)
: https://movie-phinf.pstatic.net/20180530_170/1527645793223uhWgz_JPEG/movie_image.jpg
1. AsyncTask 클래스 만들기
public class ImageLoadTask extends AsyncTask<Void, Void, Bitmap> {
private String urlStr;
private ImageView imageView;
private ProgressBar progressBar;
// 요청 url과 비트맵 객체 매핑, 메모리 관리 위한 것
private static HashMap<String, Bitmap> bitmapHash = new HashMap<>();
public ImageLoadTask(String urlStr, ImageView imageView, ProgressBar progressBar) {
this.urlStr = urlStr;
this.imageView = imageView;
this.progressBar = progressBar;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
progressBar.setVisibility(View.VISIBLE);
}
@Override
protected Bitmap doInBackground(Void... voids) {
/*
* 해당 url 에 접속하여 스트림을 받음
* 이미지일 경우 이미지 스트림 그대로 넘어오고
* decodeStream 은 이미지 스트림을 비트맵으로 바꿔줌
* (주소에 해당하는 이미지를 스트림(byte array)으로 가져옴!)
*/
Bitmap bitmap = null;
try {
if(bitmapHash.containsKey(urlStr)){ // 요청 주소가 들어있다면
Bitmap oldBitmap = bitmapHash.remove(urlStr);
if(oldBitmap != null){
oldBitmap.recycle();
oldBitmap = null;
}
}
URL url = new URL(urlStr);
bitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream());
/*
* 라이브러리들은 한번 받아놓은 이미지가 있으면 단말에 캐싱해놓고
* 같은 URL로 요청할 경우 캐싱된 로컬 이미지를 그대로 사용한다 */
bitmapHash.put(urlStr, bitmap);
} catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
progressBar.setVisibility(View.GONE);
imageView.setImageBitmap(bitmap);
imageView.invalidate();
}
}
* onPreExecute(스레드 시작), doInBackground(스레드), onProgressUpdate, onPostExecute(모든 스레드의 작업 종료) 메소드 순서로 호출.
* onProgressUpdate는 중간중간에 화면 갱신이 필요할 때 호출하면 됨. 여기서 UI 변경. 위에서 ProgressBar 설정의 경우는 모든 작업이 끝났을 때 visibility 속성을 gone 해주기 위해 onPostExecute 메소드에서 수행함.
2. 정의한 AsyncTask 클래스를 생성하고 execute 메소드 호출
String url = "https://movie-phinf.pstatic.net/20180530_170/1527645793223uhWgz_JPEG/movie_image.jpg";
ImageLoadTask imageLoadTask = new ImageLoadTask(url, imageView, progressBar);
imageLoadTask.execute();
'Android > Basic' 카테고리의 다른 글
[Android] 인터넷 연결상태 체크하기 (0) | 2018.07.31 |
---|---|
[Android] SQLiteOpenHelper (0) | 2018.07.31 |
[Android] Gson을 이용한 JSON 변환 (0) | 2018.07.07 |
[Android] Volley 라이브러리를 활용한 서버 통신 (0) | 2018.07.07 |
[Android] HttpURLConnection 예제 (0) | 2018.07.07 |