Notice
Recent Posts
Recent Comments
Link
투케이2K
506. (Android/Java) [Observable] [GSON] okhttp 요청 후 response 응답 값 Model SerializedName 파싱 및 콜백 응답 확인 본문
Android
506. (Android/Java) [Observable] [GSON] okhttp 요청 후 response 응답 값 Model SerializedName 파싱 및 콜백 응답 확인
투케이2K 2023. 2. 27. 20:18[개발 환경 설정]
개발 툴 : AndroidStudio
[소스 코드]
// -------------------------------------
// [로직 처리 실시]
// -------------------------------------
try {
// [샘플 API 호출 및 Schedulers 설정 및 구독 결과 확인]
SampleApi.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<M_Model>() { // TODO [MODEL : Observable.create 타입 지정]
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull M_Model model) {
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"[A_Test >> main() :: onNext() : 데이터 확인]");
Log.i("","\n"+"[M_MODEL : "+String.valueOf(new Gson().toJson(model))+"]");
Log.i("","\n"+"[ID : "+String.valueOf(model.id)+"]");
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();
}
// -------------------------------------
// [http 수행 클래스]
// -------------------------------------
package com.example.javaproject;
import android.util.Log;
import com.google.gson.Gson;
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.FormBody;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class SampleApi {
// [request 메소드 생성]
public static Observable<M_Model> 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/json; charset=utf-8;"); //TODO [헤더]
request.post(new FormBody.Builder().build()); // TODO [POST 쿼리스트링]
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();
// --------------------------------------
// TODO [콜백 응답 반환 : MODEL 데이터 매핑]
// --------------------------------------
subscriber.onNext(new Gson().fromJson(responseData, M_Model.class));
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 [클래스 종료]
// -------------------------------------
// [Model 정의 클래스]
// -------------------------------------
package com.example.javaproject;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class M_Model {
/**
* // --------------------------------------------------------------------------------------
* TODO [클래스 설명]
* // --------------------------------------------------------------------------------------
* 1. GSON 모델 클래스
* // --------------------------------------------------------------------------------------
* 2. @SerializedName : JSON 객체 생성 시 표시될 key name
* // --------------------------------------------------------------------------------------
* 3. @Expose : 데이터가 null 일 경우 json 생성 시 제외 설정
* // --------------------------------------------------------------------------------------
* 4. build.gradle 설정 :
*
* implementation 'com.google.code.gson:gson:2.8.6'
* // --------------------------------------------------------------------------------------
* */
/**
* // --------------------------------------------------------------------------------------
* // TODO [빠른 로직 찾기 : 주석 로직 찾기]
* // --------------------------------------------------------------------------------------
* // [SEARCH FAST] :
* // --------------------------------------------------------------------------------------
* */
// -----------------------------------------------------------------------------------------
// TODO [전역 변수 선언]
// -----------------------------------------------------------------------------------------
private static final String ACTIVITY_NAME = "M_Model";
// -----------------------------------------------------------------------------------------
// TODO [클래스 생성자 초기화]
// -----------------------------------------------------------------------------------------
public M_Model(String id){
this.id = id;
}
// -----------------------------------------------------------------------------------------
// TODO [JSON KEY DATA]
// -----------------------------------------------------------------------------------------
// [JSON KEY]
@SerializedName("id") @Expose
public String id;
} // TODO [클래스 종료]
반응형
'Android' 카테고리의 다른 글
Comments