Android:排球请求在已发布的 APK 中不起作用,而在调试中有效
Android: Volley request is not working in released APK while works in debug
我已经为 POST
创建了一个简单的截击请求
//post request handler
public void PostRequest(final int queryType, String url, final String jsonData) {
StringRequest req = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
for (ApiRequestHandler commHandler : responseListeners) {
commHandler.responseHandler(response);
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
for (ApiRequestHandler commHandler : errorListeners) {
commHandler.errorHandler(error);
}
}
}) {
@Override
public byte[] getBody() {
return jsonData.getBytes();
}
@Override
public String getBodyContentType() {
return "application/json";
}
@Override
public Map<String, String> getHeaders() {
HashMap<String, String> headers = new HashMap<>();
headers.put("Content-Type", "application/json; charset=utf-8");
return headers;
}
};
getVolleyQueue().add(req);
}
当我在调试模式下发送请求(Android 设备连接到 Android Studio 时,此方法有效,而当我发布应用程序并收到 400 错误时,此方法无效。
我已经添加了互联网权限。
应用发布时很难调试,收到错误时我只是尝试敬酒。堆栈跟踪就是这样,但对我没有帮助。
com.android.volley.toolbox.BasicNetwork.a(Unknown Source:255),
com.android.volley.NetworkDispatcher.b(Unknown Source:37),
com.android.volley.NetworkDispatcher.run(Unknown Source:5)
我花了一天的时间来解决这个问题,我的一些建议:
当服务器端发布请求时,我可以看到正文是空白的,但在 APK 级别打印数据
我也试过jsonData.getBytes("utf-8");
但是没用
我正在使用implementation 'com.android.volley:volley:1.1.1'
我还需要一些有关调试已发布 apk 的更好方法的指南。谢谢!
再深入挖掘之后,我找到了根本原因:
问题是因为我为 minifyEnabled true
的发布构建类型启用了 ProGuard。它通过各种方式压缩和混淆代码,例如更改 class 名称、变量、常量等
Gson,使用动态键命名,使键更短。
为了解决这个问题,我使用了 @SerializedName("keyName")
注释来让 Gson 知道应该将什么作为键。
例如:
public class UserInfo {
@SerializedName("user_name")
public String userName;
@SerializedName("mobile")
public String mobile;
}
希望这可以节省一些人的一天!
我已经为 POST
创建了一个简单的截击请求//post request handler
public void PostRequest(final int queryType, String url, final String jsonData) {
StringRequest req = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
for (ApiRequestHandler commHandler : responseListeners) {
commHandler.responseHandler(response);
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
for (ApiRequestHandler commHandler : errorListeners) {
commHandler.errorHandler(error);
}
}
}) {
@Override
public byte[] getBody() {
return jsonData.getBytes();
}
@Override
public String getBodyContentType() {
return "application/json";
}
@Override
public Map<String, String> getHeaders() {
HashMap<String, String> headers = new HashMap<>();
headers.put("Content-Type", "application/json; charset=utf-8");
return headers;
}
};
getVolleyQueue().add(req);
}
当我在调试模式下发送请求(Android 设备连接到 Android Studio 时,此方法有效,而当我发布应用程序并收到 400 错误时,此方法无效。 我已经添加了互联网权限。
应用发布时很难调试,收到错误时我只是尝试敬酒。堆栈跟踪就是这样,但对我没有帮助。
com.android.volley.toolbox.BasicNetwork.a(Unknown Source:255),
com.android.volley.NetworkDispatcher.b(Unknown Source:37),
com.android.volley.NetworkDispatcher.run(Unknown Source:5)
我花了一天的时间来解决这个问题,我的一些建议:
当服务器端发布请求时,我可以看到正文是空白的,但在 APK 级别打印数据
我也试过
jsonData.getBytes("utf-8");
但是没用我正在使用
implementation 'com.android.volley:volley:1.1.1'
我还需要一些有关调试已发布 apk 的更好方法的指南。谢谢!
再深入挖掘之后,我找到了根本原因:
问题是因为我为 minifyEnabled true
的发布构建类型启用了 ProGuard。它通过各种方式压缩和混淆代码,例如更改 class 名称、变量、常量等
Gson,使用动态键命名,使键更短。
为了解决这个问题,我使用了 @SerializedName("keyName")
注释来让 Gson 知道应该将什么作为键。
例如:
public class UserInfo {
@SerializedName("user_name")
public String userName;
@SerializedName("mobile")
public String mobile;
}
希望这可以节省一些人的一天!