2017-04-11 67 views
1

我正在嘗試爲研究生課程的最終任務創建新聞查看部分。 這是什麼(UserNewsActivity)所做的就是通過對獲取的數據創建調用我的方法,像這樣:Android Volley在200狀態代碼上拋出錯誤

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

    InstanciateListViewValues(); 
} 

,並從API獲取數據我在ASP.NET的網絡API 2中創建(原因也有Web部件MVC)。

獲取的數據應該存儲在「Global.NewsItemsList」中的靜態變量var中,之後我使用數據填充我的(自定義)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),檢查底部鏈接), 和我已經用相同的方式在項目之前抽取更多的數據,並且它在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作爲模擬器。

爲了保持這個問題清潔,這裏是連接到引擎收錄,與全球和NewsItemsList類和從網絡API響應:https://pastebin.com/5Za6yLDP

+0

記錄整個異常和堆棧跟蹤,而不僅僅是消息 – njzk2

+0

catch(Exception e){'非常苛刻。嘗試捕捉一些*特定*異常 –

+0

@ cricket_007「catch(Exception e){」部分是如果gson無法反序列化JSON。 – Kadaj

回答

1

HEJ Kadaj,
我只是看你的代碼,但一下就把我的注意力最是「如果值得注意的是我使用VisualStudio在本地運行我的服務,然後使用IISExpress代理我的端口,並最終使用Genymotion作爲模擬器。」
我遇到過,如果你使用iisexpress-proxy的第一個地址(在我的情況下是192.168.0.1),那麼有時候這個代理將無法工作,因爲這通常是網關地址。
爲了正確測試這個問題,請看一下這個問題(Configure IIS Express for external access to VS2010 project),之後它應該工作得很好(至少它對我有用:D)。

+0

他我只是測試了你告訴我的情況,而你是完全正確的。 它現在就像一個魅力:) – Kadaj