안녕하세요 푸민입니다.
저번 글에 이어서 이번에는 CacheDispatcher 를 알아보겠습니다!
public class CacheDispatcher extends Thread {
//역시 Thread를 상속받는다.
private final BlockingQueue<Request> mCacheQueue;
private final BlockingQueue<Request> mNetworkQueue;
private final Cache mCache;
private final ResponseDelivery mDelivery;
private volatile boolean mQuit = false;
//네트워크 큐와 캐시큐를 가지고 있고 각종 메소드를 호출 할 인터페이스를 가지고 있다.
public CacheDispatcher(BlockingQueue<Request> cacheQueue, BlockingQueue<Request> networkQueue,Cache cache,ResponseDelivery delivery) {
mCacheQueue = cacheQueue;
mNetworkQueue = networkQueue;
mCache = cache;
mDelivery = delivery;
}
public void quit() {
mQuit = true;
interrupt();
}
//종료 메소드다.
@Override
public void run() {
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
// CPU 점유율을 낮추고
mCache.initialize();
//초기화
while (true) {
try {
final Request request = mCacheQueue.take();
//캐시에 있는 정보를 하나 꺼낸다.
request.addMarker("cache-queue-take");
//마크 추가
if (request.isCanceled()) {
//취소된 것이라면
request.finish("cache-discard-canceled");
//종료 하고 다시 진행
continue;
}
Cache.Entry entry = mCache.get(request.getCacheKey());
//캐시에 있는지 확인
if (entry == null) {
//없으면 네트워크 큐에 등록하고 다시 진행
request.addMarker("cache-miss");
mNetworkQueue.put(request);
continue;
}
if (entry.isExpired()) {
//캐시가 만료 되었다면
request.addMarker("cache-hit-expired");
request.setCacheEntry(entry);
//셋팅 후 네트워크 큐에 등록하고 다시 진행
mNetworkQueue.put(request);
continue;
}
request.addMarker("cache-hit");
Response<?> response = request.parseNetworkResponse(newNetworkResponse(entry.data, entry.responseHeaders));
//캐시에 있는 정보 파싱
request.addMarker("cache-hit-parsed");
if (!entry.refreshNeeded()) {
//새로고침이 필요없다면 반환 메소드 요청
mDelivery.postResponse(request, response);
} else {
//새로고침이 필요하다면 반환하고 네트워크 큐에 다시 등록
request.addMarker("cache-hit-refresh-needed");
request.setCacheEntry(entry);
response.intermediate = true;
mDelivery.postResponse(request, response, new Runnable() {
@Override
public void run() {
try {
mNetworkQueue.put(request);
} catch (InterruptedException e) {
}
}
});
}
} catch (InterruptedException e) {
if (mQuit) {
return;
}
continue;
}
}
}
}
6번에 글에 걸쳐 Volley 소스를 분석하였습니다 ㅎㅎ Volley 에 대해서 전체적인 그림을 그릴수 있었던것 같네요! 이미지 프로세싱 중에 로딩 부분을 처리하지만 굉장히 효율적으로 관리가 될 수 있도록 구조가 짜여진것 같습니다. 필요에 의해 조금 커스터마이징해서 사용해도 좋을듯 해요!
'Development > Android' 카테고리의 다른 글
[안드로이드] Android ListView 속성값을 파헤쳐보자! (0) | 2015.09.24 |
---|---|
[안드로이드] Thread 메소드 동기화 (0) | 2015.09.23 |
[안드로이드] Android Image Volley 분석5 (0) | 2015.09.19 |
[안드로이드] Android Image Volley 분석4 (0) | 2015.09.18 |
[안드로이드] Android Image Volley 분석3 (0) | 2015.09.17 |
댓글