본문 바로가기
Development/Android

[안드로이드] Android Image Volley 분석4

by 푸민 2015. 9. 18.
반응형



안녕하세요 푸민입니다.

이어서 Volley 분석합니다!


NetworkResponse 객체는 네트워크 연결한 뒤의 결과 값이 들어 있는 개체입니다.


public class NetworkResponse {

public NetworkResponse(int statusCode, byte[] data, Map<String, String> headers, boolean notModified) {

this.statusCode = statusCode;

this.data = data;

this.headers = headers;

this.notModified = notModified;

}


public NetworkResponse(byte[] data) {

this(HttpStatus.SC_OK, data, Collections.<String, String>emptyMap(), false);

}


public NetworkResponse(byte[] data, Map<String, String> headers) {

this(HttpStatus.SC_OK, data, headers, false);

}


public final int statusCode;


public final byte[] data;


public final Map<String, String> headers;


public final boolean notModified;

}


멤버 변수로 가지고 있는 것이 Http 상태코드와 데이터 그리고 맵으로 헤더 값을 가지고 있습니다.


이제 알아볼 것은 실제로 이미지를 어떻게 가져오는지입니다. 이미지를 가져올 때 미리 생성했던 RequestQueue ImageRequest 를 생성한 것을 add() 메소드를 이용해서 추가해줍니다.


public Request add(Request request) {

request.setRequestQueue(this);

synchronized (mCurrentRequests) {

mCurrentRequests.add(request);

}


request.setSequence(getSequenceNumber());

request.addMarker("add-to-queue");


if (!request.shouldCache()) {

mNetworkQueue.add(request);

return request;

}


synchronized (mWaitingRequests) {

String cacheKey = request.getCacheKey();

if (mWaitingRequests.containsKey(cacheKey)) {

Queue<Request> stagedRequests = mWaitingRequests.get(cacheKey);

if (stagedRequests == null) {

stagedRequests = new LinkedList<Request>();

}

stagedRequests.add(request);

mWaitingRequests.put(cacheKey, stagedRequests);

if (VolleyLog.DEBUG) {

VolleyLog.v("Request for cacheKey=%s is in flight, putting on hold.", cacheKey);

}

} else {

mWaitingRequests.put(cacheKey, null);

mCacheQueue.add(request);

}

return request;

}

}


위의 mCurrentRequests HashSet<Request> 입니다. 여기에 추가를 해주고, getSequenceNumver() 에서 AutominiInteger 를 통해 seq를 설정하고, add-to-queue 라는 마커를 추가합니다.


그리고 캐쉬가 가능한지 확인후에 없다면 mNetworkQueue에 추가! 그 뒤 mWaitingRequests (Map 타입)에서 현재 캐시가 기다리고 있는지 확인 후 기다리고 있다면 꺼내서 LinkedList 에 추가해줍니다. 그러면 하나 끝날때마다 하나씩 계속 수행을 하겠죠? 그리고 기다리는 것이 없다면 바로 mCacheQueue 에 추가를 합니다.

반응형

댓글