Android:Volley请求在调试时无法在已发布的APK中运行

时间:2019-05-01 17:35:39

标签: java android android-volley

我为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错误时,此方法不起作用。 我添加了Internet权限。

发布应用程序时很难调试,我只是在收到错误时尝试举杯。 stacktrace就是这样,但是对我没有帮助。

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的更好方法的准则。谢谢!

1 个答案:

答案 0 :(得分:0)

更多的挖掘之后,我可以找到根本原因:

问题是因为我为版本号为minifyEnabled true的发行版本启用了ProGuard。它通过更改类名,变量,常量等各种方式压缩和混淆代码。

Gson,使用动态键命名使键变短。

为解决此问题,我使用了@SerializedName("keyName")批注,让Gson知道应该考虑什么作为密钥。

例如:

public class UserInfo {
    @SerializedName("user_name")
    public String userName;
    @SerializedName("mobile")
    public String mobile;
}

希望这可以节省某人的一天!