问题
private interface ResourcesApi {
@POST("/synchronize")
void getResources(@Body Map<String, Map<String, Object>> map,
Callback<DataModel> callback);
}
with calling code:
mApi.getResources(data, this);
The class implements Callback so success/failure are defined.
STACKTRACE:
03-09 18:05:15.182 28570-28746/? E/AndroidRuntime﹕ FATAL EXCEPTION: pool-2-thread-1
java.lang.IllegalStateException: Method getResources not annotated with request type (e.g., GET, POST).
at retrofit.RestMethodInfo.parseMethodAnnotations(RestMethodInfo.java:179)
at retrofit.RestMethodInfo.init(RestMethodInfo.java:115)
at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:327)
at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:262)
at retrofit.RestAdapter$RestHandler$2.obtainResponse(RestAdapter.java:313)
at retrofit.CallbackRunnable.run(CallbackRunnable.java:38)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
回答1:
It means the @POST annotation can't be found at runtime. Without the HTTP method type (and relative URL it contains), Retrofit cannot make the request.
Are you using Proguard or another tool to trim "unused" code? If so, instruct it to keep Retrofit's annotations.
回答2:
In addition to Jake's answer, this is what I had to add to my proguard file to get it to work correctly:
-keep class com.google.gson.** { *; }
-keep class com.google.inject.** { *; }
-keep class org.apache.http.** { *; }
-keep class org.apache.james.mime4j.** { *; }
-keep class javax.inject.** { *; }
-keep class retrofit.** { *; }
回答3:
Agree with @chad's answer, add below lines if still getting crash.
-keepattributes Signature
-keep class sun.misc.Unsafe { *; }
来源:https://stackoverflow.com/questions/22288868/what-does-method-getresources-not-annotated-with-request-type-e-g-get-post