웹에서 이미지를 가져와 앱 화면에 띄우는 예제
이미지 파일이 웹 서버의 어디에 위치하고 있는지에 대한 정보를 받았다면
그 파일을 다운로드할 수 있습니다.
먼저 인터넷을 사용해야 하므로 인터넷 권한을 추가합니다.
<uses-permission android:name="android.permission.INTERNET"/>
스레드를 사용하기 위해 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();
}
}
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();
}
}
앱을 실행하면 네이버 영화 사이트에서 어벤져스:엔드게임의 포스터를 가져와 화면의 이미지 뷰에 그려줍니다.