1
+ package com .loopj .android .image ;
2
+
3
+ import java .util .concurrent .Executors ;
4
+ import java .util .concurrent .ExecutorService ;
5
+
6
+ public class SmartImageView extends ImageView {
7
+ private static final int LOADING_THREADS = 4 ;
8
+ private static ExecutorService threadPool = Executors .newFixedThreadPool (LOADING_THREADS );
9
+
10
+ private SmartImageTask currentTask ;
11
+
12
+ public SmartImageView (Context context ) {
13
+ super (context );
14
+ }
15
+
16
+ public SmartImageView (Context context , AttributeSet attrs ) {
17
+ super (context , attrs );
18
+ }
19
+
20
+ public SmartImageView (Context context , AttributeSet attrs , int defStyle ) {
21
+ super (context , attrs , defStyle );
22
+ }
23
+
24
+ public void setImageUrl (String url ) {
25
+ setImage (new UrlImage (url ));
26
+ }
27
+
28
+ public void setImageContact (int contactId ) {
29
+ setImage (new ContactImage (contactId ));
30
+ }
31
+
32
+ public void setImage (final SmartImage image ) {
33
+ setImage (image , null , null );
34
+ }
35
+
36
+ public void setImage (final SmartImage image , final Integer fallbackResource ) {
37
+ setImage (image , fallbackResource , null );
38
+ }
39
+
40
+ public void setImage (final SmartImage image , final Integer fallbackResource , final Integer loadingResource ) {
41
+ // Set a loading resource
42
+ if (loadingResource != null && getDrawable () != null ){
43
+ setImageResource (loadingResource );
44
+ }
45
+
46
+ // Cancel any existing tasks for this image view
47
+ if (currentTask != null ) {
48
+ currentTask .cancel ();
49
+ currentTask = null ;
50
+ }
51
+
52
+ // Set up the new task
53
+ currentTask = new SmartImageTask () {
54
+ @ Override
55
+ public void run () {
56
+ complete (image .getBitmap ());
57
+ }
58
+ };
59
+
60
+ currentTask .setOnCompleteHandler (new SmartImageTask .OnCompleteHandler () {
61
+ @ Override
62
+ public void onComplete (Bitmap bitmap ) {
63
+ if (bitmap != null ) {
64
+ setImageBitmap (bitmap );
65
+ } else {
66
+ // Set fallback resource
67
+ if (fallbackResource != null ) {
68
+ setImageResource (fallbackResource );
69
+ }
70
+ }
71
+ }
72
+ });
73
+
74
+ // Run the task in a threadpool
75
+ threadPool .execute (currentTask );
76
+ }
77
+ }
0 commit comments