【问题标题】:Android retrofit POST working fine if app built from android studio but crashes when installed from apk如果应用程序从 android studio 构建但从 apk 安装时崩溃,则 Android 改造 POST 工作正常
【发布时间】:2019-03-16 01:19:30
【问题描述】:

当我使用 Android Studio 构建应用程序时,我有一个运行良好的应用程序。但是当我制作一个未签名的apk然后从那里安装应用程序时它会崩溃。它在单击登录按钮时崩溃,我正在使用改造调用 API。请指导我。

错误:

2019-03-16 09:16:07.185 19648-19648/com.od.phr.staging E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.od.phr.staging, PID: 19648
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equalsIgnoreCase(java.lang.String)' on a null object reference
    at com.od.phr.retrofit.PHRResponse.isSuccess(Unknown Source:4)
    at com.od.phr.retrofit.ApiCallback.onResponse(Unknown Source:474)
    at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(Unknown Source:41)
    at android.os.Handler.handleCallback(Handler.java:790)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:7000)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:441)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)

活动代码:

public void signIn(JogetResponse.Listener<Boolean> listener, JogetResponse.ErrorListener errorListener, String userId, String pass) {
    Pair<Boolean, List<String>> validate = mUser.validate(userId, pass, realm);

    if (validate.first) {
        User.UserPayload payload = new User.UserPayload(userId, pass, Constants.Action.LOGIN);

        ApiManager.getInstance(getApplication().getApplicationContext()).loginUser(payload, new ApiCallback<PHRResponse<User>>() {

            @Override
            public void onSuccessCustomFunction(PHRResponse<User> response) {
            }

            @Override
            public void onSuccess(PHRResponse<User> response) {
                listener.onResponse(Boolean.TRUE);
            }

            @Override
            public void onFail(Throwable throwable) {
                errorListener.onErrorResponse(throwable);
            }
        });

    } else {
        errorListener.onErrorResponse(new Throwable(TextUtils.join("\n", validate.second)));
    }
}

PHRResponse.java

public class PHRResponse<T> {
String status;
String msg;
T data;

public T getData() {
    return data;
}

public boolean isSuccess() {
    return status.equalsIgnoreCase("SUCCESS");
}

public String getErrorMessage() {
    return msg;
}

}

ApiCallback.java

public abstract class ApiCallback<T> implements Callback<T> {

private String log = "";

public abstract void onSuccessCustomFunction(T response);


@Override
public final void onResponse(Call<T> call, Response<T> response) {
    Log.i(Constants.TAG, "ApiCallback onResponse()");
    log += "HTTP: [" + response.code() + "]\n" +
            "HTTP Message: [" + response.message() + "]\n" +
            "URL: [" + call.request().url().toString() + "]\n" +
            "Method: [" + call.request().method() + "]\n" +
            "Host: [" + call.request().url().host() + "]\n" +
            "Query: [" + call.request().url().query() + "]\n";


    Log.i(Constants.TAG, "ApiCallback onResponse() log: " + log);
    switch (response.code()) {
        case HttpsURLConnection.HTTP_OK:
        case HttpsURLConnection.HTTP_CREATED:
        case HttpsURLConnection.HTTP_ACCEPTED:
        case HttpsURLConnection.HTTP_NOT_AUTHORITATIVE:

            Log.i(Constants.TAG, "ApiCallback switch()");
            if (response.body() != null) {
                Log.i(Constants.TAG, "ApiCallback response.body() != null" +
                        ": " + response.body());
                Log.i(Constants.TAG, "ApiCallback response.raw() != null" +
                        ": " + response.raw());
                Log.i(Constants.TAG, "ApiCallback response.message() != null" +
                        ": " + response.message());
                Log.i(Constants.TAG, "ApiCallback response.toString() != null" +
                        ": " + response.toString());
                Log.i(Constants.TAG, "ApiCallback response.isSuccessful() : " +
                        ": " + response.isSuccessful());

                if (response.body() instanceof PHRResponse) {
                    Log.i(Constants.TAG, "response.body() instanceof PHRResponse");
                    PHRResponse phrResponse = (PHRResponse) response.body();
                    Log.i(Constants.TAG, "response.body() instanceof PHRResponse data : " + phrResponse.data);
                    Log.i(Constants.TAG, "response.body() instanceof PHRResponse msg : " + phrResponse.msg);
                    Log.i(Constants.TAG, "response.body() instanceof PHRResponse status : " + phrResponse.status);
                    Log.i(Constants.TAG, "response.body() instanceof PHRResponse getErrorMessage : " + phrResponse.getErrorMessage());

                    if (!phrResponse.isSuccess() ){
                        onFail(new Throwable(phrResponse.getErrorMessage()));
                        return;
                    }
                }
                Log.i(Constants.TAG, "ApiCallback switch 1(): " + response.body());
                onSuccess(response.body());
                onSuccessCustomFunction(response.body());
            }
            break;
        case HttpsURLConnection.HTTP_FORBIDDEN:
            Log.i(Constants.TAG, "HTTP_FORBIDDEN switch 1()");
        case HttpsURLConnection.HTTP_UNAUTHORIZED:
            Log.i(Constants.TAG, "HTTP_UNAUTHORIZED switch 1()");
            doSessionTimeout();

// onUnauthorized(); 休息; 默认: Log.i(Constants.TAG, "默认开关 1()"); onFail(new Throwable(response.code() + " " + response.message())); } }

@Override
public void onFailure(Call<T> call, Throwable t) {
    Log.i(Constants.TAG, "onFailure switch 1()");

    doError(t.getMessage());
}

public abstract void onSuccess(T response);


//public abstract void onSuccess(PHRResponse<User> response);

public abstract void onFail(Throwable throwable);

private void doError(String error) {
    onFail(new Throwable(error));
}
}

注意:从 android studio 安装时它工作正常,但当我制作 apk 然后安装时崩溃。

【问题讨论】:

    标签: android exception apk retrofit okhttp


    【解决方案1】:

    经过数小时的调试,问题的解决方案是:

    从 gradle 中删除缩小和资源缩减选项。有时它是由于反射 API 而发生的。

     debug {
            debuggable true
            //minifyEnabled true
            //shrinkResources true
        }
    

    【讨论】:

    • 您可以编写 proguard 规则,而不是禁用 proguard。您可以使用数据模型的“保留类”。问题是,您的数据模型被混淆了,您的模型名称、变量发生变化并抛出 null。
    猜你喜欢
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 2017-07-22
    相关资源
    最近更新 更多