이 튜토리얼에서는 안드로이드 앱에서 인터넷상의 URL로부터 비트맵(Bitmap) 이미지를 가져와 화면에 표시하는 방법을 단계별로 알아봅니다. 네트워크 작업은 메인 스레드에서 직접 수행할 수 없기 때문에 AsyncTask를 활용해 백그라운드에서 이미지를 다운로드하는 것이 핵심 포인트입니다.
1단계: 새 프로젝트 생성
안드로이드 스튜디오(Android Studio)를 실행하고 File ⇒ New Project 메뉴로 이동한 뒤, 필요한 정보를 모두 입력하여 새 프로젝트를 생성합니다.
2단계: 레이아웃 구성
res/layout/activity_main.xml 파일에 아래 코드를 추가합니다. 화면 상단에는 기본 이미지가 배치되고, 하단에는 URL에서 불러온 이미지가 표시될 ImageView가 들어갑니다.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="https://schemas.android.com/apk/res/android" xmlns:tools="https://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="8dp" android:orientation="vertical" tools:context=".MainActivity"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:layout_gravity="center"> <ImageView android:layout_width="150dp" android:layout_height="150dp" android:layout_gravity="center" android:layout_margin="15dp" android:src="@drawable/image"/> </LinearLayout> <ImageView android:id="@+id/iMageView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:layout_margin="20sp"/> </LinearLayout>
3단계: 이미지 파일 준비
원하는 이미지 파일(.png / .jpg / .jpeg)을 res/drawable 폴더에 복사해 붙여넣습니다. 이 이미지는 앱 실행 시 처음에 표시되는 기본 이미지로 사용됩니다.
4단계: MainActivity 작성
src/MainActivity.java에 아래 코드를 추가합니다. 내부 클래스 GetImageFromUrl이 AsyncTask를 상속받아 백그라운드 스레드에서 이미지를 다운로드하고, 작업이 끝나면 onPostExecute()를 통해 ImageView에 결과 비트맵을 설정합니다.
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
import java.io.IOException;
import java.io.InputStream;
public class MainActivity extends AppCompatActivity {
Bitmap bitmap;
ImageView image;
String urlImage = "https://thumbs.dreamstime.com/z/hands-holding-blue-earth-cloud-sky" + "-elements-imag-background-image-furnished-nasa-61052787.jpg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
image = findViewById(R.id.iMageView);
new GetImageFromUrl(image).execute(urlImage);
}
public class GetImageFromUrl extends AsyncTask<String, Void, Bitmap>{
ImageView imageView;
public GetImageFromUrl(ImageView img){
this.imageView = img;
}
@Override
protected Bitmap doInBackground(String... url) {
String stringUrl = url[0];
bitmap = null;
InputStream inputStream;
try {
inputStream = new java.net.URL(stringUrl).openStream();
bitmap = BitmapFactory.decodeStream(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
@Override
protected void onPostExecute(Bitmap bitmap){
super.onPostExecute(bitmap);
imageView.setImageBitmap(bitmap);
}
}
}
5단계: 인터넷 권한 추가
androidManifest.xml에 아래 코드를 추가합니다. 특히 네트워크 통신을 위해 <uses-permission android:name="android.permission.INTERNET"/> 권한 선언이 반드시 필요합니다. 이 권한이 누락되면 앱 실행 중 네트워크 오류가 발생할 수 있습니다.
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="https://schemas.android.com/apk/res/android" package="app.com.sample"> <uses-permission android:name="android.permission.INTERNET"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
앱 실행 및 결과 확인
이제 애플리케이션을 실행해 결과를 확인해 보겠습니다. 실제 안드로이드 기기를 컴퓨터에 연결했다고 가정합니다. 안드로이드 스튜디오에서 프로젝트의 액티비티 파일 중 하나를 연 뒤 툴바의 Run 아이콘을 클릭하고, 목록에서 자신의 모바일 기기를 선택하세요. 그러면 먼저 기본 이미지가 표시된 화면이 나타나고, 잠시 후 URL에서 다운로드한 이미지로 교체되는 것을 확인할 수 있습니다.

참고 사항
AsyncTask는 API 레벨 30부터 공식적으로 지원이 중단(deprecated)되었으므로, 최신 프로젝트에서는 Kotlin Coroutines나 WorkManager 같은 대체 기술을 사용하는 것이 좋습니다. 또한 HTTPS가 아닌 HTTP 주소의 이미지를 불러오려면 매니페스트에 cleartext 트래픽 허용 설정을 추가로 지정해야 합니다.