투케이2K

179. (TWOK/LOGIC) [android] 안드로이드 HTTP 폴링 조회 시 인터넷 사용 불가능한 와이파이에 연결 된 경우 상태 체크 로직 정리 본문

투케이2K 로직정리

179. (TWOK/LOGIC) [android] 안드로이드 HTTP 폴링 조회 시 인터넷 사용 불가능한 와이파이에 연결 된 경우 상태 체크 로직 정리

투케이2K 2026. 4. 9. 19:43
728x90
반응형

[로직 정리]

정리 로직 : Mobile / Android

상태 : [android] 안드로이드 HTTP 폴링 조회 시 인터넷 사용 불가능한 와이파이에 연결 된 경우 상태 체크 로직 정리

 

[설 명]

// --------------------------------------------------------------------------------------
[사전) 설정 및 정보 확인 사항]
// --------------------------------------------------------------------------------------

1. 제 목 : [android] 안드로이드 HTTP 폴링 조회 시 인터넷 사용 불가능한 와이파이에 연결 된 경우 상태 체크 로직 정리


2. 테스트 환경 : Android / HTTP / 폴링


3. 사전) 👉 HTTP 폴링 조회 간략 설명 : 

  >> HTTP 폴링 조회는 클라이언트가 일정한 주기로 서버에 HTTP 요청을 보내서 상태나 데이터를 확인하는 방식입니다.    

  >> HTTP 폴링 조회는 클라이언트가 주기적으로 “변경된 거 있어?” 라고 서버에 물어보며, 주로 GET 요청 형태로 사용됩니다.

  >> HTTP 폴링 조회 동작 흐름 : 

   --------------------------
    Client            Server
   --------------------------
    |  ---- 요청 ---->   |
    |  <--- 응답 ----    |
         (잠시 대기)
    |  ---- 요청 ---->   |
    |  <--- 응답 ----    |
   --------------------------

// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[로직 설명]
// --------------------------------------------------------------------------------------

1. 안드로이드에서 네트워크 호출을 위한 별도 스레드 생성 및 특정 API 폴링 호출 기본 for 구문 작성

    new Thread(){
        @Override
        public void run(){
            try {

                // ✅ [폴링 카운트 및 성공 , 실패 확인 변수 선언]
                int pollingCount = 50; // 3 초 스레드 * 50 = 150 초 (2분 30초)
                boolean errFlag = false;
                String resultLog = "";


                // ✅ [HTTP 호출에 필요한 URL 및 파라미터 정의]
                String url = "https:// ...";
                String body = "{\n" +                            
                            "   \"name\":\"투케이\"\n" +
                            "}";


                // ✅ [순차적 요청 수행]
                for (int i=0; i<pollingCount; i++){

                    // .... 코드 계속 .....

                }


                // ✅ [최종 성공 및 실패 여부 판단 수행]
                if (errFlag == true){ // 실패

                }
                else { // 성공

                }

            }
            catch (Exception e) {
                e.printStackTrace();

                S_Log._E_("HTTP :: Polling :: Exception", new String[]{"Error : " + String.valueOf(e.getMessage())});
            }
        }

    }.start();


2. 안드로이드 for 구문안에서 기본 HTTP 호출 전 방어 로직 코드 작성 수행
    
    // ✅ [순차적 요청 수행]
    for (int i=0; i<pollingCount; i++){

        ✔️ 네트워크 폴링 상태를 호출하고 있는 액티비티 상태 점검
        if (C_App.isRunningActivity(activity) == false){
            errFlag = true;
            resultLog = "[Error] : activity is running false";
            break; // for 문 종료
        }


        ✔️ API 호출에 필요한 URL 및 파라미터 점검
        if (C_Util.stringIsNull(url) == true || C_Util.stringIsNull(body) == true){
            errFlag = true;
            resultLog = "[Error] : url or body data is null";
            break; // for 문 종료
        }


        ✔️ 특정 폴링 횟수마다 정상 네트워크 사용 가능 상태 점검
        if (i != 0 && i%5 == 0){ // 5 배수 인 경우 >> API 호출 전 정상 네트워크 연결 상태 체크

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){

                boolean networkUsed = C_StateCheck.isInternetUseStatus(activity);

                if (networkUsed == false){ // 네트워크 사용 불가능 상태 (👉 ex : 인터넷 사용 불가능한 와이파이 연결 or 하드웨어 기기 SoftAP 연결 or 실제 네트워크 사용 못함)
                    errFlag = true;
                    resultLog = "[Error] : network used false";
                    break; // for 문 종료
                }
            }
        }


        ✔️ 일정 시간 Thread 대기 코드 작성 (HTTP 연속 호출 대기 코드)
        Thread.sleep(3000);


        // .... 코드 계속 .....

    }


3. 안드로이드 for 구문안에서 정상적으로 모든 방어 로직 통과가 된 경우 실제 HTTP 통신 호출 및 에러 발생 응답 로직 분기 처리 수행


    // ✅ [순차적 요청 수행]
    for (int i=0; i<pollingCount; i++){

        ✔️ .... 상위 방어 로직 코드 ....


        ▶️ HTTP 통신 호출 수행 및 응답 발생 로직 분기 처리
        RequestSyncHttp.RequestSyncBodyHttp requestSyncBodyHttp = new RequestSyncHttp.RequestSyncBodyHttp(activity, "HTTP :: Start", url, body);
        requestSyncBodyHttp.start();
        try{
            requestSyncBodyHttp.join(); // [스레드 작업 완료까지 대기]
        }catch(Exception e){
            S_Log._E_("HTTP :: Thread :: Exception", new String[]{"Error : " + String.valueOf(e.getMessage())});
        }

        // [http 통신 응답 값 확인]
        Map response = requestSyncBodyHttp.getResponse();

        boolean successFlag = (boolean) response.get(RequestSyncHttp.RESPONSE_FLAG); // [HTTP 성공 , 실패 플래그]
        String resData = String.valueOf(response.get(RequestSyncHttp.RESPONSE_DATA)); // [HTTP 응답 데이터]

        if (successFlag == true){ // 👉 [successFlag : 요청 성공]
            
            errFlag = true;
            resultLog = resData; // 응답 값 삽입
            break; // ☑️ For Break
        }
        else { // ❌ [successFlag : 요청 실패]

            // ☑️ [폴링 카운트까지는 실패해도 break 없이 지속 호출 수행]
            errFlag = true;
            resultLog = "[Error] : " + resData;
        }

    }


4. 안드로이드 for 반복문 종료 후 최종 성공 및 실패 여부 판단 수행 및 알림 팝업창 표시 

    // ✅ [최종 성공 및 실패 여부 판단 수행]
    if (errFlag == true){ // 최종 폴링 실패
        showAlert("정보 확인 중 문제가 발생했습니다. ("+resultLog+")");
    }
    else { // 최종 폴링 성공
        showAlert("정보 확인에 성공했습니다. 새로고침 해주세요.");
    }


5. ✅ 주요 참고 코드 첨부 : 인터넷 사용 가능 여부 상태 확인

    // [ConnectivityManager 생성]
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);


    // [안드로이드 버전 분기 처리]
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {

        Network network = cm.getActiveNetwork();

        NetworkCapabilities networkCapabilities = cm.getNetworkCapabilities(network);

        // 👉 [인터넷 사용가능 하고 , 유효한 연결인지 확인 수행]
        boolean hasCapabilityInternet = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
        boolean hasCapabilityValidated = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);

        // 👉 [and 결과로 인터넷 사용 가능한 네트워크 환경 상태 체크]
        boolean result = (hasCapabilityInternet && hasCapabilityValidated);

        S_Log._W_("현재 연결된 네트워크 인터넷 사용 가능 상태 확인", new String[]{
                "result :: " + String.valueOf(result)
        });
    }
// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[참고 사이트]
// --------------------------------------------------------------------------------------

▶️ [ConnectivityManager , NetworkCapabilities 사용해 현재 휴대폰 인터넷 사용 가능 상태 확인]

https://kkh0977.tistory.com/7349

https://blog.naver.com/kkh0977/223668787254?trackingCode=blog_bloghome_searchlist


▶️ [android] 안드로이드 http 통신 api 호출 폴링 수행 시 액티비티 종료 상태 체크 및 폴링 로직 종료 수행

https://kkh0977.tistory.com/7697

https://blog.naver.com/kkh0977/223759676308?trackingCode=blog_bloghome_searchlist


▶️ [업무 이슈] 안드로이드 android http 통신 api 호출 폴링 수행 시 액티비티가 종료 된 상태에서도 api 호출이 지속 되는 이슈

https://kkh0977.tistory.com/7696

https://blog.naver.com/kkh0977/223759660493?trackingCode=blog_bloghome_searchlist


▶️ [Rx] repeatWhen 사용해 http 폴링 방식 요청 수행 실시 - http polling request

https://kkh0977.tistory.com/4764

https://blog.naver.com/kkh0977/223238719346?trackingCode=blog_bloghome_searchlist

// --------------------------------------------------------------------------------------
 
728x90
반응형
Comments