메뉴 건너뛰기

조회 수 2675 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

이번에는 스프링과 안드로이드를 연동해서 하는 예제 중 첫번째인 요청한 서버의 Html 소스코드를 가져오는 예제를 작성하겠습니다.


    1. 첫번째로 네트워크를 통해 가져와야함으로 "인터넷 권한을 설정해야 합니다."


manifest파일에 <!-- 인터넷 접속 권한 추가 -->

<uses-permission android:name="android.permission.INTERNET" /> 을 추가해줍니다.




2. 다음으로, 안드로이드 네트워크 작업시에 주의해야할 사항이 2가지 있습니다.



1) 안드로이드에서는 네트워크를 통해 작업을 할 때는 "반드시" "백그라운드 스레드"를 통해서 작업이 이루어져야합니다.


: 왜냐하면, 네트워크로 이미지 등을 받아올 때 시간이 다소 걸릴 수 있는데 메인스레드에서 작업할 시 다른 작업에도

지장을 주기 때문에 백그라운드에서 동작시키지 않을 경우 동작하지 않도록 제한이 걸려져 있습니다.


따라서, 쓰레드를 별도로 구현해 run() 메서드 내부에서 작업을 해야합니다.



2) 다음으로 알아둬야 할 사항은 "백그라운드 스레드"에서는 메인 스레드의 "뷰"를 제어할 수 없다는 것입니다.


예를들어, 백그라운드 스레드의 run()메서드 내에서 URL에 연결을 해 데이터를 가져오고 그 데이터를


이 run() 메서드 내부에서 textView같은 곳에 setText()해서 붙인다면 오류가 발생합니다. 이처럼 안드로이드는 백그라운드 스레드에서


메인스레드의 뷰에 접근할 수 없도록 제한이 걸려있습니다.


따라서 이러한 제한때문에 필요한 것이 "Handler"입니다.



"Handler란?"


: 핸들러는 안드로이드 네트워크 작업시 백그라운드에서 수행해야하는데 백그라운드 스레드에선 메인 뷰를 제어할 수 없기 때문에


백그라운드와 메인 스레드 사이의 통신(중계)를 담당하게 됩니다.


즉, 백그라운드 스레드는 핸들러에게 "네가 대신 화면 제어를 해줘"라고 sendMessage() 메서드를 통해 요청을 하게 됩니다.


그러면, 핸들러는 이 메시지를 받아 처리할 작업을 대신해주게 되는 것입니다.





3. 이제 이러한 이론적 지식을 가지고 아래의 구현 예제를 보겠습니다.



다음은 스프링 웹 서버로 요청해 해당 뷰의 html 소스를 가져오는 과정을 담은 예제입니다.


세부 부분에 대한 설명은 주석으로 남겨놓았습니다.

package com.example.kscs.androidspringconnection1;

 

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.EditText;

 

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.net.HttpURLConnection;

import java.net.URL;

 

// 안드로이드에서 네트워크 작업시 주의 사항

// 1."반드시, 백그라운드 스레드로 작업해야한다."

//      시간이 많이 걸리기 때문에 메인스레드에서 할 수 없게 되어 있다.

// 2. 백그라운드 스레드에서는 메인화면에 접근 할 수 없다.

public class HtmlActivity extends AppCompatActivity

                            implements Runnable{

 

    // 1. 변수 선언

    Button button1;

    EditText edit1;

    String str;

 

    // android.os.Handler

    // 핸들러 : 백그라운드 쓰레드에서는 직접 메인 화면에 접근할 수 없기 때문에

            // 백그라운드가 핸들러에게 화면 제어를 요청해서 핸들러가 대신 수행하게 된다.(이럴때 사용)

    // 즉, 백그라운드 스레드와 메인스레드의 통신(중계)을 담당한다.

    Handler handler = new Handler(){

        // Alt + Enter -> Override Methods

        // 백그라운드 스레드에서 전달된 메시지를 처리하는 method

        @Override

        public void handleMessage(Message msg) {

            super.handleMessage(msg);

            edit1.setText( str );

        }

    };

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.html);

 

        // 2. 위젯 생성

        button1 = (Button)findViewById(R.id.button1);

        edit1 = (EditText)findViewById(R.id.editText);

 

        // 3. 이벤트 처리

        button1.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                // 메인스레드 외에 백그라운드에서 실행되는 스레드 추가

                Thread th = new Thread(HtmlActivity.this);

                th.start();

            }

        });

    }

 

    // 백그라운드 스레드

    @Override

    public void run() {

        // http://192.168.0.127:8080/

        str = download();

 

        // 에러가 발생함(백그라운드 스레드에서는 메인 UI를 수정할 수 없다.)

        // Only the original thread that created a view hierarchy can touch its views

        // + 인터넷 권한을 주어야 한다. Manifest에 가서 인터넷 접속 권한 추가!

        //edit1.setText(str); // 즉, 핸들러를 통해서 화면 제어를 요청해야한다.

        handler.sendEmptyMessage(0); // sendEmptyMessage( 핸들러에게 전달할 메시지 )

        // 핸들러에 여러 메시지를 보내며 요청하는 경우 메시지의 종류에 따라 처리할 로직을 분리시켜줘야한다.

    }

    // html 소스 다운로드용 메서드

    String download(){

        StringBuffer sb = new StringBuffer();

        try{

            // 호출할 spring 서버측 주소 입력(URL주소 형태로 객체화)

            URL url = new URL("http://192.168.0.127:8080/");

            // url에 접속 객체 가져오기

            HttpURLConnection conn = (HttpURLConnection)url.openConnection();

 

            if ( conn != null ){

                // 연결 timeout 시간 설정(밀리세컨드 단위) : 지정된 시간 이후 연결 종료

                conn.setConnectTimeout(5000);

                // 캐시 사용 여부 설정

                conn.setUseCaches(false);

                // http status code 상태코드, 200 - success

                if ( conn.getResponseCode() == 200 ){

                    // conn.getInputStream() : InputStream을 리턴받음

                    BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(),"utf-8"));

                    for(;;){ // 무한 반복

                        String line = br.readLine(); // 한줄 읽기

                        if(line == null) break; // 더이상 내용이 없으면 루프 종료

                        sb.append(line+"\n");

                    }

                    br.close(); // 버퍼 닫기

                }

                conn.disconnect(); // 연결 종료

            }

        }catch(Exception e){

            e.printStackTrace();

        }

        // 가져와 append한 내용을 리턴

        return sb.toString();

    }

}







List of Articles
번호 제목 날짜 조회 수
38 스프링, MySQL, MyBatis 연동 file 2021.05.06 128
37 Java was started but returned exit code=13 - 이클립스 실행시 에러 file 2021.03.31 152
36 스프링 프로젝트 생성 후 샘플 코드 한글 깨짐 현상 file 2021.03.31 186
35 쿠팡 api 프로젝트 / 적용 테스트 (스프링 부트 / 자바 ) file 2021.03.29 567
34 스프링, MySQL, MyBatis 연동 - 데이터 조회하기 file 2021.05.06 791
33 AJAX 통신시 컨트롤러에서 한글 문자열을 리턴해야하는 경우 인코딩 문제 처리 2018.07.04 2599
» 스프링과 안드로이드 연동1(Html 소스 가져오기) 2018.07.04 2675
31 스프링과 안드로이드 연동3 : ( 서버에서 XML로 반환해 가져오기 ) 2018.07.04 2896
30 [펌]자바 Crawling(크로울링) Ajax로 요청하는 것 긁어오기 file 2018.07.04 2898
29 스프링과 안드로이드 연동2 : 서버에서 안드로이드로 이미지 가져오기(다운) 2018.07.04 3319
28 스프링과 안드로이드 연동5 : (Javascript에서 Android 함수 호출하기) 2018.07.04 3390
27 스프링에서 구글맵 연동하기 2018.07.04 4591
26 스프링 외부 경로 폴더 지정하기 2018.07.04 4616
25 스프링 Bean 객체의 초기화 및 소멸시 호출 메서드 file 2016.08.18 4996
24 스프링 XML 설정에서 자바 설정 Import하기 file 2016.08.18 5071
23 JAVA Crawling(크로울링) 기본([펌]http://partnerjun.tistory.com/guestbook) file 2018.07.04 5107
22 스프링을 구성하는 코어 모듈 - core module file 2016.12.08 5119
21 Spring AOP(Aspect Oriented Programming) 에서의 용어 file 2016.12.08 5176
20 Spring Framework 개요 2016.12.08 5339
19 Spring 개발을 위한 Eclipse 개발 환경 구성하기 file 2016.12.06 5431
Board Pagination Prev 1 2 Next
/ 2

하단 정보를 입력할 수 있습니다

© k2s0o1d4e0s2i1g5n. All Rights Reserved