2017-10-02 10 views
0

데이터베이스에서 일부 항목을로드하는 Android 애플리케이션에서 Volley 응답을 올바르게 처리하려고합니다. 발리 기능은 WebRequester 클래스에 캡슐화되어함수 호출 후 속성 값을 잃는 최종 객체

public class WebRequester extends Application { 
    public static final String TAG = WebRequester.class.getSimpleName(); 

    private RequestQueue mRequestQueue; 
    private static WebRequester mInstance; 

    public WebRequester() { 
     mInstance = this; 
    } 

    public RequestQueue getRequestQueue() { 
     if (mRequestQueue == null) { 
      mRequestQueue = Volley.newRequestQueue(getApplicationContext()); 
     } 

     return mRequestQueue; 
    } 

    public static synchronized WebRequester getInstance() { 
     return mInstance; 
    } 

    public <T> void addToRequestQueue(Request<T> req) { 
     req.setTag(TAG); 
     getRequestQueue().add(req); 
    } 

    /* ... */ 
} 

ItemsController 또 다른 클래스는 요청이 생성 될 중앙 집중화. 응답 코드를 얻기 위해, 나는 중첩 클래스, VolleyCallback를 생성 및 오버라이드 (override) parseNetworkResponse() 전화 내부의 속성 responseCode을 설정 : 다음 방법 loadItems()가 다른 클래스에서

public class FeedItemsController extends Application { 
    private String URL_GET_FEED_ITEMS = /* My URL */; 
    private static final String TAG = FeedItemsController.class.getSimpleName(); 

    private ArrayList<FeedItem> feedItems; 

    public class VolleyRequestCallback { 
     public int responseCode; 

     public int getResponseCode() { 
      return responseCode; 
     } 

     public void setResponseCode(int responseCode) { 
      this.responseCode = responseCode; 
     } 
    } 

    public void loadItems() { 
     final VolleyRequestCallback callback = new VolleyRequestCallback(); 

     if (feedItems == null) { 
      feedItems = new ArrayList<>(); 

      Cache cache = WebRequester.getInstance().getRequestQueue().getCache(); 
      Cache.Entry entry = cache.get(URL_GET_FEED_ITEMS); 

      if (entry != null) { 
       try { 
        String data = new String(entry.data, "UTF-8"); 
        parseJsonFeed(new JSONObject(data)); 
       } catch (JSONException | IOException e) { 
        e.printStackTrace(); 
       } 
      } 
      else { 
       JsonObjectRequest jsonReq = new JsonObjectRequest(Request.Method.GET, URL_GET_FEED_ITEMS, null, 
         new Response.Listener<JSONObject>() { 
          @Override 
          public void onResponse(JSONObject response) { 
           VolleyLog.d(TAG, "Response: " + response.toString()); 
           parseJsonFeed(response); 
          } 
         }, 
         new Response.ErrorListener() { 
          @Override 
          public void onErrorResponse(VolleyError error) { 
           VolleyLog.d(TAG, "Error: " + error.getMessage()); 
          } 
         } 
       ) { 
        @Override 
        protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) { 
         callback.setResponseCode(response.statusCode); 
         System.out.println("Code 1 = " + response.statusCode); 
         return super.parseNetworkResponse(response); 
        } 
       }; 

       WebRequester.getInstance().addToRequestQueue(jsonReq); 
      } 
     } 
     System.out.println("Code 2 = " + callback.getResponseCode()); 
    } 

    /* ... */ 
} 

라고합니다. 문제는 - 그것은 parseNetworkResponse() 방법을 들어갈 때 내가 요청 최우선 외부 재사용하려고 할 때의 resultCode가 올바르게,의 그러나, (200)를 말할 수 있도록 설정되어, 다시 0이다 :

Code 1 = 200 
Code 2 = 0 

이있을 수 있습니다 응답 처리의 나쁜 구현,하지만 내 주요 질문은 왜 개체 특성이 변경됩니다?

미리 감사드립니다.

답변

0

그것은 흥미로운 버그로 밝혀졌습니다. parseNetworkResponse 호출은 비동기식입니다. 즉, 첫 번째 인쇄가 수행 될 때 서버가 아직 응답하지 않았습니다.