본문 바로가기
IT기술(코딩)

안드로이드 스튜디오 서버연동 Runnable사용 (HttpURLConnection 함수) 예제

by 크리에이트매이커 2020. 8. 2.
반응형

안녕하세요 여러분~

오늘은 제가 앱을 만들면서 사용했던 함수중 중요한 Runnable (멀티스레드) 사용 예제 에 대하여 알려드리려고 해요!

먼저 멀티스레드의 간단한 사용 시기와 Runnable과의 관계, 사용 방법 예제 이렇게 설명드릴게요 !

Runnable ~

자!! 초보 개발자분들이라면 언젠가 맞딱들여야할 난제라고도 할 수 있는데 스레드!!

스레드뭐야? 멀티스레드가 뭐야.? ?

간단하게!!

스레드는 하나의 화면에서 하나의 프로세스를 수행하는 일꾼 ? 이라고 생각하시면 돼요!

보통 스레드는 한 화면(액티비티) 에서 하나를 수행하게 돼죠. 화면은 보여주는것도 하나의 일이니까요!

이때, 화면만 보여주는 기능 말고 그 화면에서 다른 기능도 하고자 할때, 멀티스레드의 개념이 생겨나죠!

사용 시기 :

스레드 하나가 일꾼인데, 일꾼이 한번에 두가지 일을 못하니까 일꾼을 추가해서 두가지의 일을 할 수 있게 하는거죠

이게 멀티스레드 에요~

참~~ 쉽죠?

관계 :

근데 왜 Runnable 이냐? Runnable이란 함수는 JAVA에 포함된 함수인데, 스레드와 기능의 거의 동일하죠.

전문적인 영역이 아니라면 그냥 동일하다고 보시면 돼요. Runnable 함수의 특징과 형태는 밑에서 알려드리죠!

안드로이드 스튜디오에는 한 액티비티(화면)에 무조건 한가지 스레드만 사용 할 수 있게 되어있어서, 멀티스레드를 사용하지 못하게 되어있어요. 그래서 스레드는 아니지만 그 기능을 하는 Runnable을 사용하는 것이죠.

초보 개발자 분들이라면 여기까지만 알고 Runnable을 그냥 사용하시면 됩니다. 원하는 바에 맞게~

사용시기 예시 :

예시는 깨깨오톡으로 예를 들게요.

여러분들이 메세지를 보내기위해 채팅중에 있죠? 근데도 여러분이 다른 메세지를 받으면 그 표시가 나오잖아요?

그게 멀티스레드의 간단한 예시라고 생각하시면 돼요~ 아닐 수도 있는데 어쨋든 동시에 2가지 이상 일을 하는 느낌 ~

이게 지속적으로 서버에서 값을 검사하거나 실시간으로 상황을 판단해야 하면서, 다른 일도 해야 하는 상황에 자주 쓰이죠~ 2가지 일을 하는거니까요!

예제 :

자 그럼 안드로이드 스튜디오에서 멀티스레드를 구현하기 위해 스레드 대신 사용되는 Runnable의 사용예제를 코드로써 봐봅시다!

저는 지속적인 서버 값을 확인 해야 하는 상황에 대한 Runnable 함수 코드를 보여드릴게요. 실제 제가 사용중인 코드에요.

 

 Runnable runnable = new Runnable() {
            @Override
            public void run() { //run 하나 밖에 없는 간단한 구조
                while (true){
                    if(i==0) {
                        try {
                            URL url = new URL(IP_check);
                            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();

                            httpURLConnection.setReadTimeout(5000);
                            httpURLConnection.setConnectTimeout(5000);
                            httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                            httpURLConnection.setRequestMethod("POST");
                            httpURLConnection.connect();


                            OutputStream outputStream = httpURLConnection.getOutputStream();
                            outputStream.write(postParameters.getBytes("UTF-8"));
                            outputStream.flush();
                            outputStream.close();


                            int responseStatusCode = httpURLConnection.getResponseCode();
                            Log.d(TAG, "POST response code - " + responseStatusCode);

                            InputStream inputStream;
                            if (responseStatusCode == HttpURLConnection.HTTP_OK) {
                                inputStream = httpURLConnection.getInputStream();
                            } else {
                                inputStream = httpURLConnection.getErrorStream();
                            }


                            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
                            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

                            StringBuilder sb = new StringBuilder();
                            String line = "";

                            while ((line = bufferedReader.readLine()) != null) {
                                sb.append(line);  //서버 값 전달 받기
                            }


                            bufferedReader.close();
                            jsonObject = new JSONObject(sb.toString()); //서버값 json 으로 변견
                           

                            if (jsonObject.getString("net").equals("1") && j==0) {
                               //조건 충족시 내가 원하는 작업을 하는 것을 작성
                            }
                            Thread.sleep(1000);
                        } catch (Exception e) {
                        }
                    }
                }
            }
        };

executorService.submit(runnable); //스레드 실행 해 주는 함수. ExecutorService 선언하면 되는데 구글에 검색하면 설명나와요. 그냥 사용 ㄱㄱ

onCreate(){} 안에다 사용하시면 돼요~

코드에 대한 자세한 설명은 안할게요.

이 코드내용은 지속적으로 1초마다 php 서버 접속을 하고 그 서버에서 계속 값을 읽어드리면서 if문의 원하는 값이 나오면 if문의 동작을 수행하게 하는 코드에요~

Runnable의 특징은 implement 함수이며, 인자는 run() 하나 밖에 없는 간단하면서 유용한 함수에요.

run() 안에서 원하는 동작의 코드를 작성하면 되죠. 전 지속적으로 서버를 검사해야 하니 while(true) 형식의

코드를 run()안에 작성 했죠.

중요 동작은 제가 주석을 달았죠 쭉~~~ 읽어보시고 본인들이 하고자 하는 동작에 맞춰 사용하시면 돼요!!

맨 밑에

executorService.submit(runnable);

스레드(동작) 들을 사용할 수 있게 해주는 방? 같은걸 주는건데, ExecutorService 내장함수에요.

구글에 검색하면 설명 잘 나와있는데 그냥 저 Runnable을 실행해!! 라는 느낌의 기능을 사용하는 함수라 생각하시면 돼요~

당연히 초기화 선언을해주고 사용하는는거에요~ 위 코드엔 선언부분은 없는데 ExecutorService 선언하고

저처럼 사용하시면 돼요~

오늘은 안드로이드 앱을 만든다면 거의 필수적으로 사용되지만 초보 개발자 분들이 이해하기 어려워하는,

스레드의 개념과 그에 비슷한 동일한 기능을 가진 Runnable에 대한 설명과 예시를 적어봤는데요~

궁금하신 사항이 있으면 댓글 달거나 잘못된 부분이 있다면 댓글 달아주세요~

안녕~ 좋아요 해주면 줗아요.

반응형