[    스프링과 안드로이드 연동2 : 서버에서 안드로이드로 이미지 가져오기    ]





이전 포스팅과 마찬가지로 네트워크를 통한 작업임으로 주의해야할 사항이 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 = new URL("http://192.168.0.127/resources/images/like1.png");
            // 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();
        }
    }
}


+ Recent posts