Notice
Recent Posts
Recent Comments
Link
투케이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();
}
[결과 출력]
반응형
'Android' 카테고리의 다른 글
Comments