
public class RestClIEnt { private APIService APIService; public RestClIEnt(String endpoint,boolean enableLogging) { Gson gson = new GsonBuilder() .registerTypeAdapterFactory(new ItemTypeAdapterFactory()) .setDateFormat("yyyy-MM-dd") .setPrettyPrinting() .excludeFIEldsWithoutExposeAnnotation() .create(); RestAdapter restAdapter = new RestAdapter.Builder() .setLogLevel(BuildConfig.DEBUG && enableLogging ? RestAdapter.LogLevel.FulL : RestAdapter.LogLevel.NONE) .setEndpoint(endpoint) .setConverter(new GsonConverter(gson)) .setRequestInterceptor(new SessionRequestInterceptor()) .build(); APIService = restAdapter.create(APIService.class); } public APIService getAPIService() { return APIService; }}public class ServiceEventHandler { private boolean isRetrofitLoggingEnabled; private String rottenTomatoesUrl; private String rottenTomatoesAPIKey; public ServiceEventHandler(Context context) { isRetrofitLoggingEnabled = Boolean.valueOf(context.getString(R.string.retrofit_logging_enabled)); rottenTomatoesUrl = context.getString(R.string.movIEs_url); rottenTomatoesAPIKey = context.getString(R.string.rotten_tomatoes_API_key); /* Look in res/values/secret.xml */ if (rottenTomatoesAPIKey.equals("REPLACE WITH YOUR KEY")) { Toast.makeText(context,context.getString(R.string.error_replace_API_key),Toast.LENGTH_LONG).show(); } } /** * 'IN THEATER' MOVIES */ @Subscribe public voID getMovIEs(final GetMovIEsEvent event) { /** * rotten_tomatoes_API_key is stored in a strings resource file named secret.xml and * located in res/values,but secret.xml has been added to .gitignore so my key doesn't * end up in source control. * * simply create your own res/values/secret.xml file with your own Rotten Tomatoes API * key and the app will run as expected. */ APIService APIService = new RestClIEnt(rottenTomatoesUrl,isRetrofitLoggingEnabled).getAPIService(); APIService.getMovIEs(rottenTomatoesAPIKey,event.getPageNumber(),event.getPagelimit(),new RestCallback<MovIEs>(event.getCallNumber()) { @OverrIDe public voID success(MovIEs movIEs,Response response) { if (response.getbody().length() > 0) { EventBus.post(movIEs); } else { EventBus.post(new APIErrorEvent(RetrofitError.unexpectedError(response.getUrl(),new httpException("Empty Body")),event.getCallNumber())); } } }); }}public abstract class RestCallback<T> implements Callback<T> { private int callNumber; public RestCallback(int callNumber) { this.callNumber = callNumber; } @OverrIDe public voID failure(RetrofitError error) { EventBus.post(new APIErrorEvent(error,this.callNumber)); } public int getCallNumber() { return callNumber; }}public interface APIService { final static String APPSETTINGS = "/application_settings.Json"; final static String MOVIES = "/in_theaters.Json"; // IN THEATER MOVIES @GET(MOVIES) voID getMovIEs(@query("APIkey") String key,@query("page") int page,@query("page_limit") int page_limit,Callback<MovIEs> cb);}解决方法 response.getbody()将返回一个Typedinput,其长度方法( http://square.github.io/retrofit/javadoc/retrofit/mime/TypedInput.html#length–)不保证在存在响应主体时返回大于零的数字.小于或等于0的值并不意味着您没有身体,只是它无法告诉您它有多长. 我猜测只有在关闭日志记录时才显示的原因是由于支持日志记录所需的缓冲细节.
您可能希望在onSuccess中对该长度以外的其他内容进行测试(例如:响应状态代码或MovIEs对象).
总结以上是内存溢出为你收集整理的android – 将Retrofit RestAdapter.LogLevel设置为FULL以外的任何内容导致Empty Response Body全部内容,希望文章能够帮你解决android – 将Retrofit RestAdapter.LogLevel设置为FULL以外的任何内容导致Empty Response Body所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)