我无法理解这里的问题是什么: 是库的问题吗?
java.lang.IllegalArgumentException:表单编码方法必须包含 至少一个@Field。 对于方法 ApiInterface.hitCheckVersionApi$79c79d47 在改造2.ServiceMethod$Builder.methodError(ServiceMethod.java:720) 在改造2.ServiceMethod$Builder.build(ServiceMethod.java:11711) 在retrofit2.Retrofit.loadServiceMethod(Retrofit.java:166) 在retrofit2.Retrofit$1.invoke(Retrofit.java:145) 在 java.lang.reflect.Proxy.invoke(Proxy.java:1006) 在 $Proxy3.hitCheckVersionApi$79c79d47(来源未知) 在 com.shopoholicbuddy.activities.SplashActivity.onCreate(SplashActivity.java:1058)
这里是代码示例:
@FormUrlEncoded
@POST("checkversion")
Call<ResponseBody> hitCheckVersionApi(@FieldMap HashMap<String, String> map);
实现代码为:
private void checkForceUpdateAPI() {
if (AppUtils.getInstance().isInternetAvailable(this)) {
final HashMap<String, String> params = new HashMap<>();
params.put(Constants.NetworkConstant.PARAM_VERSION_NAME, getAppVersion(this));
params.put(Constants.NetworkConstant.PARAM_PLATFORM, "1");
params.put(Constants.NetworkConstant.PARAM_APP_TYPE, "2");
ApiInterface apiInterface = RestApi.createService(this, ApiInterface.class);
Call<ResponseBody> call = apiInterface.hitCheckVersionApi(params);
ApiCall.getInstance().hitService(this, call, new NetworkListener() {
@Override
public void onSuccess(int responseCode, String response, int requestCode) {
try {
VersionUpdateResponse bean = new Gson().fromJson(response, VersionUpdateResponse.class);
if (bean.getCode() == 310) {
if (bean.getResult().getVersionName() != null && Double.parseDouble(bean.getResult().getVersionName())<=(Double.parseDouble(getAppVersion(SplashActivity.this)))) {
showSplashScreen();
} else {
AlertDialog.Builder builder = new AlertDialog.Builder(SplashActivity.this, R.style.DatePickerTheme);
builder.setTitle(getString(R.string.new_version_available));
builder.setMessage(getString(R.string.upgrade_to_new_version));
builder.setPositiveButton(getString(R.string.update), (dialogInterface, i) -> redirectStore("https://play.google.com/store/apps/details?id=com.shopoholic"));
if (bean.getResult().getUpdateType() != null && bean.getResult().getUpdateType().equals("1")) {
builder.setNegativeButton(getString(R.string.no_thanks), (dialogInterface, i) -> showSplashScreen());
}
builder.setCancelable(false);
builder.show();
}
} else {
showSplashScreen();
}
} catch (Exception e) {
e.printStackTrace();
showSplashScreen();
}
}
我在 RELEASE 构建中遇到了同样的问题。添加 proguard 规则即可解决该问题。 https://github.com/square/retrofit/blob/master/retrofit/src/main/resources/META-INF/proguard/retrofit2.pro 如果您在 DEBUG 构建中遇到此错误,则说明您的代码有问题。
这个错误也可能意味着,在这篇文章的情况下,您正在使用 @FormUrlEncoded 而没有 @Field,如下所示:
@FormUrlEncoded
@GET("item")
suspend fun getItems(): Response<MutableList<Item>>
所以删除@FormUrlEncoded