관리 메뉴

나만을 위한 블로그

[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:35
728x90
반응형

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()의 인자로 넘겨주면 된다.

반응형
Comments