투케이2K

471. (RxAndroid) [Observable] [Schedulers] okhttp 사용해 api 호출 및 subscribeOn , observeOn 스레드 관리, 콜백 확인 본문

Android

471. (RxAndroid) [Observable] [Schedulers] okhttp 사용해 api 호출 및 subscribeOn , observeOn 스레드 관리, 콜백 확인

투케이2K 2023. 2. 4. 22:39

[개발 환경 설정]

개발 툴 : AndroidStudio

 

[Sample_Api : 소스 코드]

package com.example.javaproject;

import android.util.Log;

import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import io.reactivex.rxjava3.core.Observable;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class Sample_Api {


    /**
     * // --------------------------------------------------------------------------------------
     * TODO [클래스 설명]
     * // --------------------------------------------------------------------------------------
     * 1. 샘플 api 호출 클래스
     * // --------------------------------------------------------------------------------------
     * 2. 필요 implementation :
     *
     * implementation("com.squareup.okhttp3:okhttp:4.9.0")
     *
     * implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
     * implementation 'io.reactivex.rxjava3:rxkotlin:3.0.1'
     * implementation 'io.reactivex.rxjava3:rxjava:3.0.7'
     * // --------------------------------------------------------------------------------------
     * */




    public static Observable<String> request() {
        return Observable.create(subscriber -> {
            try {
                if (subscriber.isDisposed() == false){ // [연결된 구독자가 있는 경우]

                    //TODO [전송 url 정의 실시]
                    String url = "https://jsonplaceholder.typicode.com/posts";


                    //TODO [파라미터값 선언 실시]
                    Map params = new HashMap();
                    params.put("userId",1);
                    params.put("id",1);


                    //TODO [url에 파라미터 추가 실시]
                    HttpUrl.Builder httpBuilder = HttpUrl.get(url).newBuilder();
                    Set set = params.keySet();
                    Iterator iterator = set.iterator();
                    while(iterator.hasNext()){
                        String key = (String) iterator.next();
                        httpBuilder.addQueryParameter(key, String.valueOf(params.get(key))); //TODO [쿼리 파람 추가]
                    }


                    //TODO [OK HTTP 객체 선언 실시]
                    OkHttpClient client = new OkHttpClient();
                    Request.Builder request = new Request.Builder();
                    request.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8;"); //TODO [헤더]
                    request.url(httpBuilder.build()); //TODO [httpBuilder 추가]


                    //TODO [비동기 처리 (enqueue 사용)]
                    client.newCall(request.build()).enqueue(new Callback() {
                        //TODO [성공한 경우]
                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
                            final String responseCode = String.valueOf(response.toString());
                            final String responseData = response.body().string();

                            // [콜백 응답 반환]
                            subscriber.onNext(String.valueOf(responseData));
                            subscriber.onComplete();
                        }
                        //TODO [실패한 경우]
                        @Override
                        public void onFailure(Call call, IOException e) {
                            final String responseCode = String.valueOf(e.toString());
                            final String responseData = String.valueOf(e.getMessage());

                            // [콜백 응답 반환]
                            subscriber.onError(e);
                            subscriber.onComplete();
                        }
                    });

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

                // [onError] 에러 알림 전달
                subscriber.onError(e);
            }
        });
    }



} // TODO [클래스 종료]
 

[호출 : 소스 코드]

        // -------------------------------------
        // [로직 처리 실시]
        // -------------------------------------
        try {

            // [샘플 API 호출 및 Schedulers 설정 및 구독 결과 확인]
            Sample_Api.request()
                    .retry((retryCnt, e)->{ // [retry : onError 발생 시 재요청 시도 : 지정 횟수 동안 재호출]
                        Log.i("---","---");
                        Log.d("//===========//","================================================");
                        Log.i("","\n"+"[A_Test >> main() :: retry() : 재요청 수행]");
                        Log.i("","\n"+"[재요청 시도 : "+String.valueOf(retryCnt)+"]");
                        Log.d("//===========//","================================================");
                        Log.i("---","---");

                        return retryCnt < 3 ? true : false;
                    })
                    .subscribeOn(AndroidSchedulers.mainThread()) // [Observable (생성자) 로직을 IO 스레드에서 실행 : 백그라운드]
                    .observeOn(Schedulers.io()) // [Observer (관찰자) 로직을 메인 스레드에서 실행]
                    .subscribe(new Observer<String>() { // [Observable.create 타입 지정]
                        @Override
                        public void onSubscribe(@NonNull Disposable d) {
                            Log.i("---","---");
                            Log.d("//===========//","================================================");
                            Log.i("","\n"+"[A_Test >> main() :: onSubscribe() : 구독 해제 상태 확인]");
                            Log.i("","\n"+"[구독 해제 여부 : "+String.valueOf(d.isDisposed())+"]");
                            Log.d("//===========//","================================================");
                            Log.i("---","---");
                        }

                        @Override
                        public void onNext(@NonNull String s) {
                            Log.i("---","---");
                            Log.w("//===========//","================================================");
                            Log.i("","\n"+"[A_Test >> main() :: onNext() : 데이터 확인]");
                            Log.i("","\n"+"[value : "+String.valueOf(s)+"]");
                            Log.w("//===========//","================================================");
                            Log.i("---","---");
                        }

                        @Override
                        public void onError(@NonNull Throwable e) {
                            Log.i("---","---");
                            Log.e("//===========//","================================================");
                            Log.i("","\n"+"[A_Test >> main() :: onError() : 에러 발생]");
                            Log.i("","\n"+"[error : "+String.valueOf(e.getMessage())+"]");
                            Log.e("//===========//","================================================");
                            Log.i("---","---");
                        }

                        @Override
                        public void onComplete() {
                            Log.i("---","---");
                            Log.w("//===========//","================================================");
                            Log.i("","\n"+"[A_Test >> main() :: onComplete() : 완료 상태]");
                            Log.w("//===========//","================================================");
                            Log.i("---","---");
                        }
                    });
        }
        catch (Exception e){
            e.printStackTrace();
        }
 

[결과 출력]


 
반응형
Comments