본문 바로가기
Development/Android

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

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



안녕하세요 푸민입니다.

안드로이드에서 권장하는 이미지 Api인 Volley 에 대해서 한번 분석해보겠습니다.



먼저 Volley 를 사용할 때는 RequestQueue 를 생성합니다. RequestQueue 를 생성할때 Volley 클래스의 newRequestQueue 메소드를 사용합니다.


public class Volley {

private static final String DEFAULT_CACHE_DIR = "volley";


public static RequestQueue newRequestQueue(Context context, HttpStack stack) {

File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR);

String userAgent = "volley/0";

try {

String packageName = context.getPackageName();

PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0);

userAgent = packageName + "/" + info.versionCode;

} catch (NameNotFoundException e) {

}

if (stack == null) {

if (Build.VERSION.SDK_INT >= 9) {

stack = new HurlStack();

} else {

stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));

}

}

Network network = new BasicNetwork(stack);

RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network);

queue.start();

return queue;

}


public static RequestQueue newRequestQueue(Context context) {

return newRequestQueue(context, null);

}

}


위의 Volley 클래스를 보면 SDK 버전에 따라서 둘로 나뉘는 것을 확인할 수 있습니다. 9 버전 이상일 경우 HurlStack 클래스를, 미만일 경우 HttpClientStack 을 사용합니다. HttpClientStack 에서는 HttpGet, HttpPost 등 클래스를 이용하여 접속하고, HurlStack 에서는 HttpUrlConnection 클래스를 이용합니다.


이것을 나누는 이유가 있는데요. HttpPostHttpGet HttpClient 같은 경우 원래 Apache 의 소스였고, 이것을 안드로이드가 들고와서 사용하는데 하위 버전과의 호환성 때문에 Apache의 HttpClient의 최신 버전을 따라가지 않는다고 합니다. 그에 비해 HttpConnection 같은 경우 하위 버전에서는 오류가 많았지만 계속 업데이트가 되어 9 버전 즉 진저브레드 이상부터 사용하기 좋아졌다고 합니다.


그리고 DickBasedCache 라는 클래스가 있습니다.


public class DiskBasedCache implements Cache {

private final Map<String, CacheHeader> mEntriesnew LinkedHashMap<String, CacheHeader>(16, .75f, true);

private long mTotalSize = 0;

private final File mRootDirectory;

private final int mMaxCacheSizeInBytes;

private static final int DEFAULT_DISK_USAGE_BYTES = 5 * 1024 * 1024;

private static final float HYSTERESIS_FACTOR = 0.9f;

private static final int CACHE_MAGIC = 0x20120504;


public DiskBasedCache(File rootDirectory, int maxCacheSizeInBytes) {

mRootDirectory = rootDirectory;

mMaxCacheSizeInBytes = maxCacheSizeInBytes;

}


public DiskBasedCache(File rootDirectory) {

this(rootDirectory, DEFAULT_DISK_USAGE_BYTES);

}

}


위의 소스를 보시면 파일을 생성하고 DickCache 를하고 또 LinkedHashMap 을 이용하여 MemoryCache를 합니다. 즉 우리가 설정만 잘해준다면 따로 캐싱처리와 이미지 저장을 안해도 되는것이지요!

반응형

댓글