이전 포스팅과 마찬가지로 네트워크를 통한 작업임으로 주의해야할 사항이 2가지 있다.
1. 안드로이드는 네트워크 작업시 "백그라운드 스레드"로 동작을 시켜야한다.(대용량 데이터를 네트워크로 가져오는 동안 다른 작업은 할 수 없게 될 수 있음으로...)
2. 백그라운드 스레드에서는 메인 뷰 화면을 제어할 수 없다. 따라서 가져온 이미지를 백그라운드 스레드에서 적용할 수가
없다. 따라서, 핸들러에게 대신 요청을 해주어야 한다.
3. 인터넷을 사용해야 함으로 manifest에 인터넷 사용 권한을 추가해 주어야 한다.
라는 사항을 유의하고 작업하면 그 외의 부분은 이전과 거의 유사하다.
나머지는 코드의 주석을 통해 설명하겠습니다.
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | package com.example.kscs.androidspringconnection1; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ImageView; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; public class ImageDownActivity extends AppCompatActivity implements Runnable{ // 1. 변수 선언 Button button1; ImageView img1; Bitmap bitmap; // 비트맵 객체 // 메인 스레드와 백그라운드 스레드 간의 통신 Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super .handleMessage(msg); // 서버에서 받아온 이미지를 핸들러를 경유해 이미지뷰에 비트맵 리소스 연결 img1.setImageBitmap(bitmap); } }; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.image_down); // 2. 위젯 연결 button1 = (Button)findViewById(R.id.button1); img1 = (ImageView)findViewById(R.id.img1); // 3. 서버에 이미지를 하나 넣어놓자. // /resources/images/이미지.png 처럼 올려 놓자. // 그냥... 환경설정에 자원 경로로 등록 된 곳에 올리면 된다. // 4. 버튼 클릭 이벤트 button1.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { // 네트워크 연결 작업시 이미지 가져오는 것도 대량의 데이터임으로 // 반드시!! 백그라운드 스레드에서 작업해야한다. // 또한, 역시 마찬가지로 백그라운드 스레드는 메인뷰 화면은 제어할 수 없어 // 핸들러에게 부탁해서 작업해야함! // + 인터넷 접속 권한 필요!(MAINFEST에 추가) // 백그라운드 스레드 생성 Thread th = new Thread(ImageDownActivity. this ); // 동작 수행 th.start(); } }); } // 백그라운드 스레드 @Override public void run() { URL url = null ; try { // 스트링 주소를 url 형식으로 변환 // url에 접속 시도 HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.connect(); // 스트림 생성 InputStream is = conn.getInputStream(); // 스트림에서 받은 데이터를 비트맵 변환 // 인터넷에서 이미지 가져올 때는 Bitmap을 사용해야함 bitmap = BitmapFactory.decodeStream(is); // 핸들러에게 화면 갱신을 요청한다. handler.sendEmptyMessage( 0 ); // 연결 종료 is.close(); conn.disconnect(); } catch (Exception e){ e.printStackTrace(); } } } |