메뉴 건너뛰기

조회 수 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 스프링(spring) 메일 발송 :: mailSender 2016.08.18 14879
37 play framework + 이클립스 초간단 개발환경 구축법 2016.12.08 12419
36 쿠키와 세션을 이용한 자동 로그인 처리 file 2018.07.04 8973
35 루씬 기본적인 검색 엔진 - 샘플 예제 file 2016.12.08 7769
34 자바 스프링프레임워크 개발환경 설정하기-1편 file 2016.08.18 6840
33 자바 스프링프레임워크 개발환경 설정하기-2편 file 2016.08.18 6490
32 검색엔진 (2) - 라이브러리: Lucene, Solr, Elasticsearch 2016.12.08 6228
31 자바 스프링, spring AOP 구현 (xml 방식) file 2016.08.18 6200
30 검색엔진 (1) - 검색엔진의 이해 2016.12.08 6032
29 [펌]자바 Crawling(크로울링) 로그인 해 긁어오기 file 2018.07.04 6006
28 [패스트캣]1. 시작하기 - 설치 file 2016.12.08 5982
27 Nutch 0.9 를 이용하여 한글 검색하기 2016.12.08 5928
26 자바 스프링, spring AOP 구현 (xml 방식) file 2016.08.18 5892
25 스프링 2.5.2 설치및 HelloWorld 출력하기 file 2016.12.06 5836
24 스프링 AOP의 주요 용어 file 2016.08.18 5829
23 solr적용시 사용법 2016.12.08 5582
22 Spring Security Basic 인증 비활성화 설정 file 2016.08.18 5556
21 스프링과 안드로이드 연동4 : (JSON으로 가져오기) file 2018.07.04 5530
20 Spring 개발을 위한 Eclipse 개발 환경 구성하기 file 2016.12.06 5431
19 Spring Framework 개요 2016.12.08 5339
Board Pagination Prev 1 2 Next
/ 2

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

© k2s0o1d4e0s2i1g5n. All Rights Reserved