Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Показывать изображения, если они есть в Кэше - Программирование Android

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Программирование Android Как это реализовать? http://www.cyberforum.ru/android-dev/thread912113.html
Подскажите как реализовать то что изображено на картинке прикрепленной?
Программирование Android Показать только один раз Подскажите, как можно показать заставку(это может быть изображение, или активность с imageView) только при первом запуске приложения??? При последующих запусках не показывать. http://www.cyberforum.ru/android-dev/thread912050.html
AdMob: Advertiser или Publisher? Программирование Android
Я хочу зарабатывать на рекламе, т.е. размещать рекламу в своем приложении. Прочитал, что для этого в AdMob в пункте Account Type нужно указать Advertiser, но это ведь рекламодатель... так что все...
мультитач зум Программирование Android
накидал тут мультитач зум, но не могу разобраться, как заставить изображение в ImageView не вылазить за пределы видимости пользователя .setOnTouchListener(new View.OnTouchListener() { private...
Программирование Android Bluetooth соединение с другим устройством. Пароль http://www.cyberforum.ru/android-dev/thread911845.html
Возможно ли при соединении через Bluetooth с еще не сопряженным устройством не заставлять пользователя вводить пароль в автоматически открывающуюся форму, а программно задать его? Код примерно...
Программирование Android приложение vs background Вопрос больше теритический Освобождаете ли вы ресурсы когда приложение сворачивается, к примеру тяжелые массивы или еще какие то данные И потом когда приложение снова открывается вы их... подробнее

Показать сообщение отдельно
MonStar
19 / 19 / 3
Регистрация: 10.04.2011
Сообщений: 225
01.07.2013, 20:33
Вот моя реализация ImageLoader. Изображения кешируются в памяти и в кэш директорию телефона. Надеюсь разберетесь, если есть вопросы по возможности отвечу.

Тут так же реализована очередь, в результате чего в первую очередь грузятся изображения, которые в данный момент на экране. Получается довольно шустро.

У меня объект класса предоставляется классом Application, точнее его наследником. Можно немного переписать под обычный паттерн синглтон.

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
import android.widget.ImageView;
 
public interface IImageManager {
 
    public void loadImage(String url, ImageView imageView);
}
Java
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.support.v4.util.LruCache;
import android.util.Log;
import android.util.SparseArray;
import android.widget.ImageView;
 
public abstract class AbstractImageManager implements IImageManager{
    
    public static final String TAG = AbstractImageManager.class.getSimpleName();
 
    private LruCache<String, Bitmap> memoryCache;
    private SparseArray<String> syncImageView;
    private Handler handler;
    private ExecutorService executorService;
    private Exception mError;
    private List<Callback> queue;
    private Context context;
 
    public interface Callback {
        String getUrl();
 
        void onSuccess(Bitmap bm);
 
        void onError(Exception e);
    }
    
    public AbstractImageManager(Context context, int sizeMemoryCache, int poolSize) {
        this.context = context;
        memoryCache = new LruCache<String, Bitmap>(sizeMemoryCache) {
            @Override
            protected int sizeOf(String key, Bitmap value) {
                int size = value.getWidth() * value.getHeight() * 4;
                return size;
            }
 
        };
        syncImageView = new SparseArray<String>();
        handler = new Handler();
        queue = Collections.synchronizedList(new ArrayList<Callback>());
        executorService = Executors.newFixedThreadPool(poolSize);
    }
    
    public void loadImage(final String url, final ImageView imageView) {
        if (url == null || url.equals("") || imageView == null) {
            return;
        }
        Bitmap bitmap = getBitmapFromMemory(url);
        if (bitmap != null) {
            imageView.setImageBitmap(bitmap);
            return;
        } else {
            imageView.setImageDrawable(null);
        }
 
        syncImageView.put(imageView.hashCode(), url);
 
        queue.add(0, new Callback() {
 
            @Override
            public void onSuccess(Bitmap bm) {
                if (mError != null) {
                    onError(mError);
                    mError = null;
                    return;
                }
                if (bm != null) {
                    if (getUrl().equals(syncImageView.get(imageView.hashCode()))) {
                        imageView.setImageBitmap(bm);
                        syncImageView.delete(imageView.hashCode());
                    }
                    addBitmapToMemCache(getUrl(), bm);
                }
                execute();
            }
 
            @Override
            public void onError(Exception e) {
                Log.e(TAG, "Error: " + e);
            }
 
            @Override
            public String getUrl() {
                return url;
            }
        });
        execute();
    }
 
    private void execute() {
        executorService.execute(new Runnable() {
            @Override
            public void run() {
 
                final Callback callback;
 
                synchronized (queue) {
                    if (queue.isEmpty()) {
                        return;
                    }
                    callback = queue.remove(0);
                }
 
                Bitmap bitmap = null;
                String url = callback.getUrl();
                String path = getPathCacheDir(url);
                if (new File(path).exists()) {
                    bitmap = loadBitmapFromFile(path);
                } else {
                    try {
                        bitmap = loadBitmapFromWeb(url);
                    } catch (final IOException e) {
                        mError = e;
                    }
                }
 
                final Bitmap bm = bitmap;
                handler.post(new Runnable() {
 
                    @Override
                    public void run() {
                        callback.onSuccess(bm);
                    }
                });
            }
        });
    }
 
    private Bitmap getBitmapFromMemory(String url) {
        return memoryCache.get(url);
    }
 
    private void addBitmapToMemCache(String url, Bitmap bitmap) {
        if (getBitmapFromMemory(url) == null) {
            memoryCache.put(url, bitmap);
        }
    }
    
    private Bitmap loadBitmapFromFile(String path) {
        return BitmapFactory.decodeFile(path);
    }
 
    private Bitmap loadBitmapFromWeb(final String url) throws IOException {
        final Bitmap bitmap = loadBitmap(url);
        new Thread(new Runnable() {
 
            @Override
            public void run() {
                addBitmapToFileCache(getPathCacheDir(url), bitmap);
            }
        }).start();
        return bitmap;
    }
 
 
    private void addBitmapToFileCache(String path, Bitmap bitmap) {
        if (bitmap == null || path == null) {
            Log.d(TAG, "Write to file bitmap or path = null ");
            return;
        }
        OutputStream out = null;
        try {
            out = new BufferedOutputStream(new FileOutputStream(path));
            bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
        } catch (FileNotFoundException e) {
            this.mError = e;
        } finally {
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    this.mError = e;
                }
            }
        }
    }
 
    protected Context getContext() {
        return context;
    }
    
    protected abstract Bitmap loadBitmap(String url) throws IOException;
 
    protected abstract String getPathCacheDir(String url);
}
Java
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
import java.io.File;
import java.io.IOException;
 
import android.content.Context;
import android.graphics.Bitmap;
 
import common.managers.AbstractImageManager;
import common.utils.MD5Util;
 
public class ImageManager extends AbstractImageManager {
 
    public static final String TAG = ImageManager.class.getSimpleName();
    public static final String SERVICE_NAME = "--IMAGE_MANAGER--";
 
    private static final int SIZE_MEM_CACHE = 4 * 1024 * 1024;
    private static final int POOL_SIZE = 3;
 
    public ImageManager(Context context) {
        super(context, SIZE_MEM_CACHE, POOL_SIZE);
    }
 
    public static ImageManager get(Context context) {
        return (ImageManager) context.getApplicationContext().getSystemService(SERVICE_NAME);
    }
 
    @Override
    public Bitmap loadBitmap(String url) throws IOException {
        return HttpClientManager.get(getContext()).loadAsBitmap(url);
    }
 
    @Override
    public String getPathCacheDir(String url) {
        return getContext().getCacheDir().getAbsolutePath() + File.separator + MD5Util.getInstance().md5(url);
    }
 
}
Java
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
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
 
public class MD5Util {
 
    private static final MD5Util INSTANCE = new MD5Util();
    
    public static MD5Util getInstance(){
        return INSTANCE;
    }
    
     public String md5(String s) {
            try {
                MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
                digest.update(s.getBytes());
                byte messageDigest[] = digest.digest();
                StringBuffer hexString = new StringBuffer();
                for (int i = 0; i < messageDigest.length; i++) {
                    hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
                }
                return hexString.toString();
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
            return "";
        }
}
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru