메뉴 건너뛰기

조회 수 2733 추천 수 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();

    }

}







  1. 스프링, MySQL, MyBatis 연동 - 데이터 조회하기

    Date2021.05.06 Views869
    Read More
  2. 스프링, MySQL, MyBatis 연동

    Date2021.05.06 Views170
    Read More
  3. Java was started but returned exit code=13 - 이클립스 실행시 에러

    Date2021.03.31 Views236
    Read More
  4. 스프링 프로젝트 생성 후 샘플 코드 한글 깨짐 현상

    Date2021.03.31 Views234
    Read More
  5. 쿠팡 api 프로젝트 / 적용 테스트 (스프링 부트 / 자바 )

    Date2021.03.29 Views663
    Read More
  6. AJAX 통신시 컨트롤러에서 한글 문자열을 리턴해야하는 경우 인코딩 문제 처리

    Date2018.07.04 Views2663
    Read More
  7. 스프링에서 구글맵 연동하기

    Date2018.07.04 Views4700
    Read More
  8. 스프링과 안드로이드 연동1(Html 소스 가져오기)

    Date2018.07.04 Views2733
    Read More
  9. 스프링과 안드로이드 연동2 : 서버에서 안드로이드로 이미지 가져오기(다운)

    Date2018.07.04 Views3399
    Read More
  10. 스프링과 안드로이드 연동3 : ( 서버에서 XML로 반환해 가져오기 )

    Date2018.07.04 Views2950
    Read More
  11. 스프링과 안드로이드 연동4 : (JSON으로 가져오기)

    Date2018.07.04 Views5597
    Read More
  12. 스프링과 안드로이드 연동5 : (Javascript에서 Android 함수 호출하기)

    Date2018.07.04 Views3465
    Read More
  13. JAVA Crawling(크로울링) 기본([펌]http://partnerjun.tistory.com/guestbook)

    Date2018.07.04 Views5191
    Read More
  14. [펌]자바 Crawling(크로울링) 로그인 해 긁어오기

    Date2018.07.04 Views6106
    Read More
  15. [펌]자바 Crawling(크로울링) Ajax로 요청하는 것 긁어오기

    Date2018.07.04 Views2967
    Read More
  16. 쿠키와 세션을 이용한 자동 로그인 처리

    Date2018.07.04 Views9063
    Read More
  17. 스프링 외부 경로 폴더 지정하기

    Date2018.07.04 Views4689
    Read More
  18. play framework + 이클립스 초간단 개발환경 구축법

    Date2016.12.08 Views12605
    Read More
  19. 루씬 기본적인 검색 엔진 - 샘플 예제

    Date2016.12.08 Views7835
    Read More
  20. [패스트캣]1. 시작하기 - 설치

    Date2016.12.08 Views6044
    Read More
Board Pagination Prev 1 2 Next
/ 2

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

© k2s0o1d4e0s2i1g5n. All Rights Reserved