[안드로이드] 웹에서 이미지 가져오기

김영훈·2020년 4월 21일
0
post-custom-banner

웹에서 이미지를 가져와 앱 화면에 띄우는 예제

이미지 파일이 웹 서버의 어디에 위치하고 있는지에 대한 정보를 받았다면
그 파일을 다운로드할 수 있습니다.

1. AndroidMainifest.xml에 인터넷 권한 추가

먼저 인터넷을 사용해야 하므로 인터넷 권한을 추가합니다.

<uses-permission android:name="android.permission.INTERNET"/>

2. AsyncTask

스레드를 사용하기 위해 AsyncTask를 상속하여 새로운 클래스를 정의합니다.

이 클래스를 이용해 객체를 생성할 때는 이미지가 있는 주소와 함께 이 이미지를 다운로드받은 후 화면에 보여줄 때 사용할 이미지뷰(ImageView) 객체를 파라미터로 전달합니다.

스레드 내에서 동작하는 doInBackground 메소드 안에서는 웹서버의 이미지 데이터를 받아 비트맵 객체로 만들어줍니다.

BitmapFactory 클래스의 decodeStream 메소드를 사용하면 간단한 코드 만으로도 비트맵 객체를 만들어줄 수 있습니다.

비트맵 객체로 변환하고 나면 메인 스레드에서 이미지뷰에 표시합니다.

onPostExecute 메소드 안에 다음과 같이 넣어줍니다.

public class ImageLoadTask extends AsyncTask<Void,Void, Bitmap> {

    private String urlStr;
    private ImageView imageView;
    private static HashMap<String, Bitmap> bitmapHash = new HashMap<String, Bitmap>();

    public ImageLoadTask(String urlStr, ImageView imageView) {
        this.urlStr = urlStr;
        this.imageView = imageView;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected Bitmap doInBackground(Void... voids) {
        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());

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

        imageView.setImageBitmap(bitmap);
        imageView.invalidate();
    }
}

3. MainActivity.java

public class MainActivity extends AppCompatActivity {

    Button button;
    ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView = (ImageView) findViewById(R.id.imageView);
        button = (Button) findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendImageRequest();
            }
        });
    }

    public void sendImageRequest() {
        String url = "https://movie-phinf.pstatic.net/20190417_250/1555465284425i6WQE_JPEG/movie_image.jpg?type=m665_443_2";
        
        ImageLoadTask task = new ImageLoadTask(url,imageView);
        task.execute();
    }
}

4. 실행 결과

앱을 실행하면 네이버 영화 사이트에서 어벤져스:엔드게임의 포스터를 가져와 화면의 이미지 뷰에 그려줍니다.

post-custom-banner

0개의 댓글