[안드로이드/android] 이미지뷰(imageview) url로 이미지 지정하기.

Posted by 앱해피
2015. 8. 19. 11:05 안드로이드 스튜디오
안드로이드 어플을 구현하는 과정에서 많은 양의 이미지를 보여줘야 하는 경우가 많이 있습니다.

 

하지만 많은 양의 이미지를 모두 어플에 넣어서 배포하면 용량이 기하급수적으로 증가한다는 문제가 있습니다.

 

이 문제를 해결할 수 있는 방법 중 하나가 바로 웹상의 이미지 URL주소를 이용해서 이미지를 출력하는 것입니다.

 

예제 소스와 주석을 통해서 웹에서 이미지를 가져오고 출력하는 방법을 정리해보겠습니다.

 

 

 

 

 

package arabiannight.tistory.com.java.test;

public class MainActivity extends AppCompatActivity {

    public static final String baseShoppingURL = "웹에서 가져올 이미지 URL 주소";
    private ProgressDialog progressDialog;

    ImageView imageView;
    Bitmap bitmap;

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

        imageView = (ImageView) findViewById(R.id.imageView);
	
	//	안드로이드에서 네트워크 관련 작업을 할 때는
	//	반드시 메인 스레드가 아닌 별도의 작업 스레드에서 작업해야 합니다.

        Thread mThread = new Thread() {

            @Override
            public void run() {

                try {
                    URL url = new URL(baseShoppingURL); // URL 주소를 이용해서 URL 객체 생성

		//	아래 코드는 웹에서 이미지를 가져온 뒤
		//	이미지 뷰에 지정할 Bitmap을 생성하는 과정
		
                    HttpURLConnection conn = (HttpURLConnection)url.openConnection();
                    conn.setDoInput(true);
                    conn.connect();

                    InputStream is = conn.getInputStream();
                    bitmap = BitmapFactory.decodeStream(is);

                } catch(IOException ex) {

                }
            }
        };

        mThread.start(); // 웹에서 이미지를 가져오는 작업 스레드 실행.

        try {
		
		//	메인 스레드는 작업 스레드가 이미지 작업을 가져올 때까지
		//	대기해야 하므로 작업스레드의 join() 메소드를 호출해서
		//	메인 스레드가 작업 스레드가 종료될 까지 기다리도록 합니다.

            mThread.join(); 

		//	이제 작업 스레드에서 이미지를 불러오는 작업을 완료했기에
		//	UI 작업을 할 수 있는 메인스레드에서 이미지뷰에 이미지를 지정합니다.
		
            imageView.setImageBitmap(bitmap); 
        } catch (InterruptedException e) {

        }

    }

 

 

 

 

중요한 내용은 다음과 같습니다.

 

1. 네트워크 작업은 메인 스레드가 아닌 별도의 작업에서 한다.

 

2. 사진을 불러오는 작업 스레드가 작업을 완료할 때까지 UI 관련 기능을 담당하는 메인스레드는 대기한다.

 

3. 인터넷 관련 작업을 할 때는 <uses-permission android:name="android.permission.INTERNET" /> 를 매니페스트 파일에 등록

 

감사합니다 ^_^