은근한

Android NetworkImageView (Volley) 본문

카테고리 없음

Android NetworkImageView (Volley)

EsJoo 2014. 10. 25. 14:34

volley.jar

첨부파일 있어용!!



안드로이드에서 이미지를 불러 올때 항상 AsyncTask를 써야해서 많은양의 


이미지를 올릴때 다소 느린감이 있었는데


얼마전 Google I/O 였나요?? Volley라는 Library 파일이 배포됬다고 합니다.


Volley파일에 NetworkImageView 가 있는데 써보니 이미지 로딩시간이 엄청 단축되네요


혹시나 도움이 될까하고 제가 썼었던 코드를 올려 봅니다.


밑에 스크립트처럼 그대로 생성하셔서 바로 쓸수있습니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import android.content.Context;
import android.graphics.Bitmap;
import android.support.v4.util.LruCache;
 
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley;
 
public class VolleySingleton {
    private static VolleySingleton instance;
    private RequestQueue requestQueue;
    private ImageLoader imageLoader;
 
    private VolleySingleton(Context context) {
        requestQueue = Volley.newRequestQueue(context);
 
        imageLoader = new ImageLoader(requestQueue,
                new ImageLoader.ImageCache() {
 
                    private final LruCache<String, Bitmap> cache = new LruCache<String, Bitmap>(
                            20);
 
                    @Override
                    public void putBitmap(String url, Bitmap bitmap) {
                        // TODO Auto-generated method stub
                        cache.put(url, bitmap);
 
                    }
 
                    @Override
                    public Bitmap getBitmap(String url) {
                        // TODO Auto-generated method stub
                        return cache.get(url);
                    }
                });
    }
 
    public static VolleySingleton getInstance(Context context) {
        if (instance == null) {
            instance = new VolleySingleton(context);
        }
        return instance;
    }
 
    public RequestQueue getRequestQueue() {
        return requestQueue;
    }
 
    public ImageLoader getImageLoader() {
        return imageLoader;
    }
 
    public <T> void addToRequestQueue(Request<T> req) {
        req.setTag("App");
        getRequestQueue().add(req);
    }
 
}



여기있는것만 쓰시면 안되구요~ 

클래스를 하나 새로 만들어서 아래 코드를 새로 작성합니다!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import android.graphics.Bitmap;
import android.support.v4.util.LruCache;
import com.android.volley.toolbox.ImageLoader;
 
public class BitmapLruCache extends LruCache<String, Bitmap> implements ImageLoader.ImageCache{
 
    
    private static int getDefaultLruCacheSize(){
        int maxMemory = (int)(Runtime.getRuntime().maxMemory()/1024);
        int cacheSize = maxMemory /8;
        return cacheSize;
    }
    
    public BitmapLruCache(){
        super(getDefaultLruCacheSize());
    }
    
    public BitmapLruCache(int maxSize) {
        super(maxSize);
        // TODO Auto-generated constructor stub
    }
    
    @Override
    protected int sizeOf(String key, Bitmap value) {
        return value.getRowBytes() * value.getHeight() / 1024;
    }
    
    
 
    @Override
    public Bitmap getBitmap(String url) {
        // TODO Auto-generated method stub
        return get(url);
    }
 
    @Override
    public void putBitmap(String url, Bitmap bitmap) {
        // TODO Auto-generated method stub
        put(url,bitmap);
        
    }
 
}
 

이렇게 작성하신뒤에 사용법은 엄청 간단 합니다

이미지를 불러올 자바파일에서 클래스 밑에

private ImageLoader mImageLoader;

를 선언해준뒤에 
이미지를 부를 메소드안에

mImageLoader = VolleySingleton.getInstance(activity).getImageLoader();
(변수)              = (VolleySingleton은 클래스 명입니다.)


라고 적어줍니다.

레이아웃에 NewtworImageView를 쓰는데 해당하는 id를 가져옵니다.

NetworkImageView pv = (NetworkImageView)convertView.findViewById(R.id.profile_image);

전 아답터에서 썼기에 convertView로 view가 정의 되어서 위의 처럼 썼습니다.

그냥 findViewById하셔도 무난합니다.


그리고 아래의 코드를 추가


pv.setImageUrl("url주소!!", mImageLoader);


setIamgeUrl에서 첫번째 파라미터는 url주소 두번째는 아까 선언한 mImageLoader를 넣어주시면됩니다. ㅎㅎ


이렇게 하면 실행시 이미지를 바로바로 불러오는 NetworkimageView가 만들어 집니다.


혹시 궁금하신 사항 있으시면 댓글남겨주세요~