일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 서비스 쓰레드 차이
- 안드로이드 레트로핏 crud
- rxjava cold observable
- 플러터 설치 2022
- 자바 다형성
- rxjava hot observable
- 안드로이드 유닛테스트란
- Rxjava Observable
- 멤버변수
- 클래스
- 2022 플러터 설치
- 안드로이드 라이선스
- 안드로이드 라이선스 종류
- 안드로이드 os 구조
- android ar 개발
- jvm이란
- 안드로이드 유닛 테스트
- 안드로이드 레트로핏 사용법
- 스택 자바 코드
- ar vr 차이
- 2022 플러터 안드로이드 스튜디오
- 큐 자바 코드
- android retrofit login
- 객체
- rxjava disposable
- 안드로이드 유닛 테스트 예시
- 서비스 vs 쓰레드
- jvm 작동 원리
- 스택 큐 차이
- ANR이란
- Today
- Total
나만을 위한 블로그
[Android] Kotlin으로 레트로핏 사용 시 나오는 에러 해결법 정리 본문
1. java.lang.NoSuchMethodError: No static method metafactory
이 에러는 자바 호환성 중 자바 8버전 호환성이 없기 때문에 발생한다.
앱 수준 gradle에 아래를 추가하면 해결된다.
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
2. CLEARTEXT communication to xx.xxx.xxx.xx not permitted by network security policy
이 에러는 매니페스트의 <application> 태그 안에 android:usesCleartextTraffic="true" 속성 넣어주면 해결된다.
3. socket failed: EACCES (Permission denied)
Permission denied에서 볼 수 있듯 이 에러는 매니페스트에 인터넷 권한을 부여하지 않으면 생기는 에러다.
<uses-permission android:name="android.permission.INTERNET" />
위 퍼미션 코드를 복붙하면 해결된다.
4. Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $
이 에러는 GsonConverterFactory를 설정해주지 않아서 발생하는 에러다.
implementation "com.squareup.retrofit2:converter-gson:2.8.1"
위의 의존성 문구를 앱 수준 gradle에 복붙한 뒤 임포트해주면 해결된다.
그러나 이 에러를 해결한 후 레트로핏으로 데이터 전송 시 아래와 같은 에러가 발생할 수 있다.
5. JSON document was not fully consumed.
이 에러에 대해서 square의 retrofit 깃허브 이슈에서 레트로핏 제작자가 아래와 같이 말했다.
이 예외는 Gson이 일반적으로 사용자 정의 유형 어댑터의 버그를 나타내는 응답 본문을 완전히 사용하지 않을 때 발생합니다. 예제 응답 본문, JSON 모델 개체 및 사용자 지정 유형 어댑터가 없으면 문제가 어디에 있는지 알 수 없습니다.
근데 무슨 말인지 모르겠다. 대략 모델 클래스에 아래와 같이 써넣으면 해결된다고 한다.
@SerializedName("isSend")
private boolean isSend;
@SerializedName("code")
private int code;
하지만 내 경우에는 이런 모델 클래스가 필요없는 곳에서 String으로 값을 가져오려다가 발생했기 때문에 다른 해결법을 찾았다.
해결법은 레트로핏 객체를 생성할 때 다른 컨버터 팩토리를 만드는 것이었다.
if (retrofit == null)
{
retrofit = Retrofit.Builder()
.baseUrl(baseURL)
// .addConverterFactory(GsonConverterFactory.create(gson))
.addConverterFactory(ScalarsConverterFactory.create())
.build()
}
빌드할 때 GsonConverterFactory를 추가하면 ScalarsConverterFactory를 추가하더라도 GsonConverterFactory가 먼저 작동한다. 그러면 필연적으로 에러가 날 수밖에 없다.
그래서 GsonConverterFactory를 주석 처리한 후 ScalarsConverterFactory만을 사용해봤다. 이렇게 하니 에러 없이 정상적으로 작동했다.
참고한 사이트)
findfun.tistory.com/654?category=396678
github.com/square/retrofit/issues/3004
'Android' 카테고리의 다른 글
[Android] 액션바, 상태바 색깔 바꾸는 방법 (0) | 2021.02.09 |
---|---|
[Android] 안드로이드 스튜디오에서 토큰으로 깃허브 로그인하는 방법 (0) | 2021.02.08 |
[Android] Room DB란? (0) | 2021.01.31 |
[Android] Room DB 사용법 (0) | 2021.01.30 |
[Android] FCM 적용한 앱을 스토어에 등록한 후 java.lang.NullPointerException: Firebase Instance ID component is not present 에러 발생 시 해결법 (0) | 2021.01.24 |