메뉴 건너뛰기

조회 수 54 추천 수 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
번호 제목 날짜 조회 수
33 AJAX 통신시 컨트롤러에서 한글 문자열을 리턴해야하는 경우 인코딩 문제 처리 2018.07.04 41
32 스프링에서 구글맵 연동하기 2018.07.04 54
» 스프링과 안드로이드 연동1(Html 소스 가져오기) 2018.07.04 54
30 스프링과 안드로이드 연동2 : 서버에서 안드로이드로 이미지 가져오기(다운) 2018.07.04 56
29 스프링과 안드로이드 연동3 : ( 서버에서 XML로 반환해 가져오기 ) 2018.07.04 52
28 스프링과 안드로이드 연동4 : (JSON으로 가져오기) file 2018.07.04 49
27 스프링과 안드로이드 연동5 : (Javascript에서 Android 함수 호출하기) 2018.07.04 52
26 JAVA Crawling(크로울링) 기본([펌]http://partnerjun.tistory.com/guestbook) file 2018.07.04 45
25 [펌]자바 Crawling(크로울링) 로그인 해 긁어오기 file 2018.07.04 47
24 [펌]자바 Crawling(크로울링) Ajax로 요청하는 것 긁어오기 file 2018.07.04 51
23 쿠키와 세션을 이용한 자동 로그인 처리 file 2018.07.04 57
22 스프링 외부 경로 폴더 지정하기 2018.07.04 39
21 play framework + 이클립스 초간단 개발환경 구축법 2016.12.07 913
20 루씬 기본적인 검색 엔진 - 샘플 예제 file 2016.12.07 3369
19 [패스트캣]1. 시작하기 - 설치 file 2016.12.07 3016
18 검색엔진 (2) - 라이브러리: Lucene, Solr, Elasticsearch 2016.12.07 2788
17 검색엔진 (1) - 검색엔진의 이해 2016.12.07 2547
16 Nutch 0.9 를 이용하여 한글 검색하기 2016.12.07 2699
15 solr적용시 사용법 2016.12.07 2673
14 Spring Framework 개요 2016.12.07 2493
Board Pagination Prev 1 2 Next
/ 2

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

© k2s0o1d4e0s2i1g5n. All Rights Reserved