Notice
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- android retrofit login
- 서비스 vs 쓰레드
- 클래스
- 안드로이드 레트로핏 crud
- 2022 플러터 안드로이드 스튜디오
- Rxjava Observable
- 큐 자바 코드
- ar vr 차이
- 안드로이드 라이선스 종류
- 안드로이드 유닛 테스트
- 스택 자바 코드
- 안드로이드 유닛테스트란
- 스택 큐 차이
- rxjava cold observable
- 멤버변수
- 자바 다형성
- 안드로이드 라이선스
- 서비스 쓰레드 차이
- 안드로이드 유닛 테스트 예시
- jvm 작동 원리
- 객체
- jvm이란
- 안드로이드 레트로핏 사용법
- 2022 플러터 설치
- android ar 개발
- rxjava hot observable
- ANR이란
- rxjava disposable
- 플러터 설치 2022
- 안드로이드 os 구조
Archives
- Today
- Total
나만을 위한 블로그
[Android] 레트로핏 사용 중 end of input at line 1 column 1 path $ 에러 해결 (코틀린 버전 첨부) 본문
Android
[Android] 레트로핏 사용 중 end of input at line 1 column 1 path $ 에러 해결 (코틀린 버전 첨부)
참깨빵위에참깨빵_ 2020. 5. 19. 21:35728x90
반응형
onFailure() 부분에 토스트로 t.getLocalizedMessage()를 넣어 에러 발생 시 어떤 에러인지 볼 수 있도록 했는데 자꾸 end of input 어쩌고 하는 메시지가 뜬다. 짜증나서 찾아보니 해결책이 있다.
클래스 하나 만들고 ApiClient.java 파일에 한 줄 추가해주면 된다.
// NullOnEmptyConverterFactory.java
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import okhttp3.ResponseBody;
import retrofit2.Converter;
import retrofit2.Retrofit;
public class NullOnEmptyConverterFactory extends Converter.Factory {
@Override
public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit)
{
final Converter<ResponseBody, ?> delegate = retrofit.nextResponseBodyConverter(this, type, annotations);
return new Converter<ResponseBody, Object>() {
@Override
public Object convert(ResponseBody body) throws IOException
{
if (body.contentLength() == 0) {
return null;
}
return delegate.convert(body);
}
};
}
}
위 클래스를 만들고 ApiClient.java 파일에 위 클래스를 new 예약어와 함께 addConverterFactory()의 인자로 넘겨주면 된다.
if (retrofit == null)
{
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(new NullOnEmptyConverterFactory())
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
}
.baseUrl() 바로 밑의 addConverterFactory(new NullOnEmptyConverterFactory()) 부분이 추가됐다.
보통 GsonConverterFactory만 넘길텐데, 그 외의 ConverterFactory를 추가하는 함수의 인자로 new NullOnEmptyConverterFactory()를 넘겨주면 된다.
앱을 재빌드하고 문제의 액티비티로 이동하면 에러가 발생하지 않는 걸 볼 수 있다.
참고로 코틀린의 경우는 이런 모양새다.
class NullOnEmptyConverterFactory : Converter.Factory() {
override fun responseBodyConverter(type: Type?, annotations: Array<Annotation>?, retrofit: Retrofit?): Converter<ResponseBody, *>? {
val delegate = retrofit!!.nextResponseBodyConverter<Any>(this, type!!, annotations!!)
return Converter<ResponseBody, Any> {
if (it.contentLength() == 0L) return@Converter EmptyResponse()
delegate.convert(it)
}
}
}
그리고 ApiClient.kt 파일에는 이렇게 써주면 될 것이다.
val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(new NullOnEmptyConverterFactory())
.addConverterFactory(GsonConverterFactory.create(gson))
.build()
만약 GsonConverterFactory.create(gson)의 gson이 빨간 맛이 된다면 Gson 객체를 만들고 = new GsonBuilder()한 다음 옵션 필요한 거 몇 개 달아주고 create(); 해준다.
그리고 이 Gson 객체를 GsonConverterFactory.create()의 인자로 넘겨주면 된다.
반응형
'Android' 카테고리의 다른 글
[Android] 파이어베이스 연동 시 '앱을 실행하여 설치 확인'이 진행되지않는 에러 해결 (0) | 2020.05.25 |
---|---|
[Android] 레트로핏2.x에서 response를 String으로 받아오는 법 (0) | 2020.05.21 |
[Android] Resources$NotFoundException: String resource ID #0x1 에러 해결 (0) | 2020.05.13 |
[Android] Volley를 이용한 회원가입, 로그인 기능 구현 2편(with MySQL, PHP) (0) | 2020.04.30 |
[Android] TCP/IP 일대다 채팅 소스코드 (0) | 2020.04.28 |
Comments