안녕하세요 푸민입니다.
벌써 다섯번째 시간이네요! 곧 마무리 지을수 있을것 같습니다 아자!
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 에러메소드 호출 시에는 알맞은 값을 들고 와서 에러를 호출해줍니다.
'Development > Android' 카테고리의 다른 글
[안드로이드] Thread 메소드 동기화 (0) | 2015.09.23 |
---|---|
[안드로이드] Android Image Volley 분석6 (0) | 2015.09.22 |
[안드로이드] Android Image Volley 분석4 (0) | 2015.09.18 |
[안드로이드] Android Image Volley 분석3 (0) | 2015.09.17 |
[안드로이드] Android Image Volley 분석 02 (0) | 2015.09.16 |
댓글