메인 쓰레드는 이미지 다운로드 동안 기다릴 수 없기 때문에 AsynkTask로 작성한다.

그리고 리스너를 달아주어 다운로드 완료 후 처리를 하도록한다.

 

ImageUrlDown.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.example.test_html_bytecode;
 
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
 
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
 
public class ImageUrlDown extends AsyncTask<StringString, Bitmap> {
    // 다운로드 완료 후 호출 할 리스너
    public interface OnPostDownLoadListener {
        void onPost(Bitmap bitmap);
    }
 
    private Bitmap bitmap = null;
    private OnPostDownLoadListener onPostDownLoad;
 
    // 리스너 세팅
    public ImageUrlDown(OnPostDownLoadListener paramOnPostDownLad) {
        onPostDownLoad = paramOnPostDownLad;
    }
    
    @Override
    protected Bitmap doInBackground(String... strings) {
        try {
            // 파라미터로 받은 url로 부터 이미지 다운로드
            bitmap = BitmapFactory.decodeStream((InputStream) new URL(strings[0]).getContent());
            return bitmap;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
 
    @Override
    protected void onPostExecute(Bitmap bitmap) {
        super.onPostExecute(bitmap);
        // 이미지 다운로드 완료 후 리스너 호출
        if (onPostDownLoad != null)
            onPostDownLoad.onPost(bitmap);
    }
}
 
cs

 

호출은 아래와 같이한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    private void downloadImage() {
        String imageURL = "http://puzi.tistory.com/image.png"//이미지 URL
        // 이미지 다운로드 클래스 생성 및 리스너 작성
        ImageUrlDown imageUrlDown = new ImageUrlDown((bitmap) -> {
            try {
                // 파일 생성
                File file = new File(filePath,fileName);
                // 아웃풋 스트림 생성
                FileOutputStream fileOutputStream = new FileOutputStream(file);
                // 아웃풋 스트림 작성
                bitmap.compress(Bitmap.CompressFormat.PNG,100,fileOutputStream);
                // 아웃풋 스트림 출력
                fileOutputStream.flush();
                // 아웃풋 스트림 종료
                fileOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
        // url 전달
        imageUrlDown.execute(imageURL);
    }
cs

참고 : https://lannstark.tistory.com/34?category=840464 

 

Java InputStream이란?

InputStream OutputStream을 실무에서 사용할 때면, 뭔가 알긴 알고 실제로 둘을 활용해 기능을 구현하는데는 전혀 문제가 없지만, 사용할때마다 찾아보게되고 뭔가 정확히 아는 것 같지는 않다라는 느

lannstark.tistory.com

 

+ Recent posts