데이터베이스에서 일부 항목을로드하는 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
이있을 수 있습니다 응답 처리의 나쁜 구현,하지만 내 주요 질문은 왜 개체 특성이 변경됩니다?
미리 감사드립니다.