在Android中获取API的响应

时间:2017-08-03 13:52:38

标签: java android api response

我有从API连接获取响应的问题,我使用logcat(Log.wtf)测试它然后在我的ConnectAPI.java中收到数据的第一个类中发现了logcat,但是logcat(Log。 wtf)在我的main.java中的第二个类中无法获得第一堂课的响应,请帮我弄清楚它有什么不对,非常感谢!

第一堂课(在ConnectAPI.java中)

public static void A020 (final Context context, String Manual, final ZooCallback callback){
    HttpUrl url = new HttpUrl.Builder()
            .scheme(SCHEME)
            .host(HOST)
            .port(PORT)
            .addPathSegments(A020_PATH)
            .addQueryParameter("LId", PersonID.getID(context))
            .addQueryParameter("Coordinates", getGPS(context))
            .addQueryParameter("Manual", Manual)
            .build();

    Request request = new Request.Builder()
            .url(url)
            .build();

    Log.d("A020 printing out the url", url.toString());

    mClient.newCall(request).enqueue(new Callback() {

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            try {

 Log.wtf("A020 print out in connectapi",response.toString());

                if (response != null && response.isSuccessful()) {
                    String jsonData = response.body().string();
                    final JSONObject Jobject = new JSONObject(jsonData);
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            callback.onSuccess(Jobject);
                        }
                    });
                }
            } catch (final JSONException e) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        callback.onFail("exception", e.getMessage());
                    }
                });
            }
        }

        @Override
        public void onFailure(Call call, final IOException e) {
            handler.post(new Runnable() {
                @Override
                public void run() {
                    callback.onFail("onFailure", e.getMessage());
                }
            });
        }

    });

第二课(在main.java中)

ConnectAPI.A020(context, Manual, new ZooCallback(){
        @Override
        public void onSuccess(JSONArray response){
            super.onSuccess(response);
            try{
                Log.wtf("A020 printing the response in mainjava", response.toString());


            }catch(JSONException e){
                Log.d("probleminA020", e.getMessage());
            }catch(Exception e){
                Log.d("probleminA020", e.getMessage());
            }
        }

        public void onFail(String title, String error){
            super.onFail(title, error);
            Log.d(TAG, error);
        }
    });

1 个答案:

答案 0 :(得分:2)

  

多么可怕的失败:报告一个永远不会发生的情况。该错误将始终记录在具有调用堆栈的ASSERT级别。根据系统配置,可以将报告添加到DropBoxManager和/或可以使用错误对话框立即终止进程。

这是Log.wtf背后的文档。当您使用Log.wtf时,它可能会抛出错误。在这种情况下,它会被您拥有的try-catch捕获。不要使用Log.wtf进行调试,因为这会导致应用程序崩溃。

使用Log.d(或Log.d或您喜欢的任何内容)但在任何情况下都不使用Log.wtf进行调试

将Log.wtf替换为另一个Log调用(我建议使用Log.d),然后重试。

最有可能发生的事情是Log.wtf抛出异常。然后,您可以通过方便的try-catch捕获此异常。然后代码打印出错误消息。它不打印的原因是因为它还会抛出一个异常,然后你就不会完全打印出来了,这就解释了为什么你不知道是什么原因导致它

为了将来的目的,在打印堆栈跟踪时,请使用e.printStackTrace,因为它会打印整个堆栈跟踪,而不仅仅是错误消息。

您遇到的另一个错误是与您的代码长度相关的问题。如果oyu目标API 24或更高版本,则有23个字符限制:

  

如果tag.length()&gt ;,则抛出IllegalArgumentException。 23对于Nougat(7.0)版本(API< = 23)和之前的版本,在此API级别之后没有标记限制。

如果您未定位API 24或更高版本,请忽略此部分。

如果您的目标是API 24或更高版本,则必须将标记缩短为23个字符或更少。保持标签简短通常是个好主意,如果不是

,API 24+会使应用程序崩溃