본문 바로가기
Development/Android

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

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


안녕하세요 푸민입니다.

저번 글에 이어서 이번에는 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 에 대해서 전체적인 그림을 그릴수 있었던것 같네요! 이미지 프로세싱 중에 로딩 부분을 처리하지만 굉장히 효율적으로 관리가 될 수 있도록 구조가 짜여진것 같습니다. 필요에 의해 조금 커스터마이징해서 사용해도 좋을듯 해요!

반응형

댓글