【问题标题】:Android Volley Error thrown on 200 status code在 200 状态码上引发 Android Volley 错误
【发布时间】:2017-04-13 15:34:38
【问题描述】:

我正在尝试创建一个新闻查看部分,作为我研究生最后一项任务的一部分。 这个 (UserNewsActivity) 的作用是通过调用我的方法在创建时获取数据,如下所示:

ListView list;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_user_news);

    InstanciateListViewValues();
}

并从我在 Asp .Net Web Api 2 中创建的 api 中获取数据(因为 mvc 中也有 web 部件)。

然后应将获取的数据存储在“Global.NewsItemsList”中的静态变量中,然后填充我的(自定义)ListView 与数据。 问题是我不断收到 200 响应的错误:

   E/Volley: [110] BasicNetwork.performRequest: Unexpected response code 200 for  http://192.168.56.1:5000/News/GetNews

   I/System.out: NetworkError

有时它只是有效:S 我 100% 确定我得到了正确的数据(在浏览器中检查,200 状态(OK),检查底部链接), 并且我之前在项目中以相同的方式使用 volley 获取更多数据,并且它的工作时间为 100%。 方法如下:

   private void InstanciateListViewValues() {
    if (Global.NewsItemsList == null) {
        final String url = ApiLink + "/News/GetNews";
        RequestQueue queue = Volley.newRequestQueue(this);

        JsonObjectRequest getRequest = new JsonObjectRequest(Request.Method.GET, url, null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        try {
                            Iterator<String> keys = response.keys();                                
                            String str_Name = keys.next();                                
                            String jsonString = response.optString(str_Name);

                            Gson gson = new Gson();
                            Global.NewsItemsList = gson.fromJson(jsonString, new TypeToken<List<NewsDetailsViewModel>>() {
                            }.getType());

                            setAdapterData();
                        } catch (Exception e) {
                            System.out.println(e.getMessage());
                            Toast.makeText(UserNewsActivity.this, "An error occured, please try later.",
                                    Toast.LENGTH_SHORT).show();
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(UserNewsActivity.this, "An error occured, please try later.",
                                Toast.LENGTH_SHORT).show();

          //System.out.println(error.getMessage());//if left uncommented will break app
                        if (error instanceof TimeoutError || error instanceof NoConnectionError) {
                            System.out.println("TimeoutError || NoConnectionError");
                        } else if (error instanceof AuthFailureError) {
                            System.out.println("AuthFailureError");
                        } else if (error instanceof ServerError) {
                            System.out.println("ServerError");
                        } else if (error instanceof NetworkError) {
                            System.out.println("NetworkError");
                            NetworkResponse response = error.networkResponse;
                            if (error instanceof ServerError && response != null) {
                                try {
                                    String res = new String(response.data,
                                            HttpHeaderParser.parseCharset(response.headers, "utf-8"));

                                    JSONObject obj = new JSONObject(res);
                                    System.out.println(obj.toString());
                                } catch (UnsupportedEncodingException e1) {
                                    System.out.println(e1.getMessage());
                                    e1.printStackTrace();
                                } catch (JSONException e2) {
                                    System.out.println(e2.getMessage());
                                    e2.printStackTrace();
                                }
                                catch (Exception e3) {
                                    System.out.println(e3.getMessage());
                                    e3.printStackTrace();
                                }
                            }
                        } else if (error instanceof ParseError) {
                            System.out.println("ParseError");
                        }
                    }
                }
        );            
        queue.add(getRequest);
    } else {
        setAdapterData();
    }
}

如果值得注意的是,我使用 VisualStudio 在本地运行我的服务,然后使用 IISExpress 代理我的端口,最后使用 Genymotion 作为模拟器。

为了保持这个问题干净,这里是 pastebin 的链接,带有 Global 和 NewsItemsList 类以及来自 Web api 的响应:https://pastebin.com/5Za6yLDP

【问题讨论】:

  • 记录整个异常和堆栈跟踪,而不仅仅是消息
  • catch (Exception e) { 非常苛刻。尝试捕捉一些特定的异常
  • 我知道,但是“正确的”异常处理会捕获只有 Gson 抛出的特定错误,而不是 try 块中的任何内容
  • 无论如何,把e.getMessage()的行替换成e.printStackTrace()方法调用
  • 我没有生气 :) 我更喜欢你 edit 更多日志消息的问题

标签: android android-volley


【解决方案1】:

赫吉·卡达杰,
我只是在看你的代码,但最让我注意的是“如果值得注意的是,我使用 VisualStudio 在本地运行我的服务,然后使用 IISExpress 代理我的端口,最后使用 Genymotion 作为模拟器。”
我遇到过,如果您使用 iisexpress-proxy 的第一个地址(在我的情况下是 192.168.0.1),该代理有时将无法工作,因为这通常是网关地址。
为了正确测试,请查看这个问题 (Configure IIS Express for external access to VS2010 project),然后它应该可以正常工作(至少它对我有用:D)。

【讨论】:

  • 嘿伙计,我刚刚测试了你告诉我的内容,你是绝对正确的。它现在就像一个魅力:)
猜你喜欢
  • 2015-11-09
  • 2018-08-19
  • 1970-01-01
  • 2012-03-06
  • 2014-03-31
  • 2017-07-12
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
相关资源
最近更新 更多