본문 바로가기
Development/Android

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

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


안녕하세요 푸민입니다.

벌써 다섯번째 시간이네요! 곧 마무리 지을수 있을것 같습니다 아자!


NetworkDispatcher 클래스는 실질적으로 네트워킹을 하는 부분입니다.

Thread 를 상속 받아서 run() 에서 각종 처리기능이 동작되며 이전에 NetworkDispatcher RequestQueue 에서 start() 를 호출합니다. 즉 queue 내부에서는 계속해어 Thread 가 돌고 있다는 것입니다. CacheDispatcher 에 하나와 설정한 수 만큼의 NetworkDispatcher 만큼 돌고 있습니다.


public class NetworkDispatcher extends Thread {

private final BlockingQueue<Request> mQueue;

private final Network mNetwork;

private final Cache mCache;

private final ResponseDelivery mDelivery;

private volatile boolean mQuit = false;


}


변수들을 보면 처음의 BlockingQueue 를 제외하면 클래스 하나와 모두 인터페이스들입니다. 각종 처리를 할 때 메소드들을 호출할 것입니다.


public NetworkDispatcher(BlockingQueue<Request> queue, Network network, Cache cache, ResponseDelivery delivery) {

mQueue = queue;

mNetwork = network;

mCache = cache;

mDelivery = delivery;

}


생성자를 통해서 값들을 받습니다.


public void quit() {

mQuit = true;

interrupt();

}


종료 메소드입니다. mQuit 를 설정하여 종료되었다는 것을 설정하고 interrupt()를 통해서 Thread 를 종료 시킵니다.


public void run() {

Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);

// 위의 메소드를 사용하게 되면 해당 스레드의 CPU 점유율을 낮춰줄수 있다.


Request request;

while (true) {

try {

request = mQueue.take();

//큐의 제일 처음에 있는 요청을 반환한다.

} catch (InterruptedException e) {

//인터럽트 될때 처리

if (mQuit) {

//종료되었으면 리턴 아니면 진행!

return;

}

continue;

}

try {

request.addMarker("network-queue-take");

//요청의 마크 추가.


if (request.isCanceled()) {

//요청이 취소되었다면 종료 후 진행

request.finish("network-discard-cancelled");

continue;

}


if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {

//OS 버젼이 아이스크림 샌드위치 보다 높다면 적용

// 스레드에서 발생하는 트래픽을 알수 있다.


TrafficStats.setThreadStatsTag(request.getTrafficStatsTag());

}


NetworkResponse networkResponse = mNetwork.performRequest(request);

//네트워크 요청


request.addMarker("network-http-complete");

//마크 추가 


if (networkResponse.notModified && request.hasHadResponseDelivered()) {

request.finish("not-modified");

//바뀌지 않았다면 요청 종료 후 진행


continue;

}


Response<?> response = request.parseNetworkResponse(networkResponse);

//결과값 파싱


request.addMarker("network-parse-complete");


if (request.shouldCache() && response.cacheEntry != null) {

//캐시 없다면 캐시 추가 

mCache.put(request.getCacheKey(), response.cacheEntry);

request.addMarker("network-cache-written");

}


request.markDelivered();

mDelivery.postResponse(request, response);

//리스폰스 메소드 호출 

} catch (VolleyError volleyError) {

//볼리 에러메소드 호출 

parseAndDeliverNetworkError(request, volleyError);

} catch (Exception e) {

VolleyLog.e(e, "Unhandled exception %s", e.toString());

//익셉션 에러 호출 

mDelivery.postError(request, new VolleyError(e));

}

}

}


위의 주석에 나와 있듯이 진행이 됩니다. 실질적으로 네트워크에 요청하는 NetowkrResponse 의 제어단이라고 볼 수 있겠네요.


private void parseAndDeliverNetworkError(Request<?> request, VolleyError error) {

error = request.parseNetworkError(error);

mDelivery.postError(request, error);

}


Volley 에러메소드 호출 시에는 알맞은 값을 들고 와서 에러를 호출해줍니다.

반응형

댓글