Я взял часть из некоторых основных методов кэширования / загрузки изображений, которые разработали люди, и придумал что-то, что использует кеш браузера и очень быстро загружает изображения.
Моя проблема в том, что иногда изображения не являются правильными (дубликат другого изображения), и когда я прокручиваю вниз список изображений, изображения мерцают и изменяются при прокрутке. Это то, с чем я должен жить?
Да, я создаю новую тему для каждого изображения. Я попробовал один поток в очереди, и загрузка заняла слишком много времени. Несмотря на то, что все они являются отдельными потоками, не следует загружать imageView с неправильными объектами рисования.
Вот мой код.
public void fetchDrawableOnThread(final String urlString, final ImageView imageView) {
if (imageView != null && urlString != null && urlString.length() > 0)
{
final Handler handler = new Handler() {
@Override
public void handleMessage(Message message) {
imageView.setImageDrawable((Drawable) message.obj);
}
};
Thread thread = new Thread() {
@Override
public void run() {
if (imageView != null && urlString != null && !urlString.equals(""))
{
URL url;
try {
InputStream is = fetch(urlString);
if (is != null) {
Drawable drawable = Drawable.createFromStream((InputStream)is, "src");
Message message = handler.obtainMessage(1, drawable);
handler.sendMessage(message);
}
}
catch (MalformedURLException e) {
Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
} catch (IOException e) {
Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
}
}
}
};
thread.start();
}
}
private InputStream fetch(String urlString) throws MalformedURLException, IOException {
if (urlString != null)
{
URL url = new URL(urlString);
URLConnection connection = url.openConnection();
connection.setUseCaches(true);
Object response = connection.getContent();
if (response instanceof InputStream) {
return (InputStream) response;
}
}
return null;
}
* EDIT ***
После всех комментариев вот мой код: в настоящее время я получаю 05-19 00: 16: 49.535: ОШИБКА / AndroidRuntime (12213): java.lang.RuntimeException: Canvas: попытка использовать переработанный растровый рисунок Android. graphics.Bitmap@4070dab0, когда я пытаюсь перезапустить.
Кроме того, когда у меня не было корзины, все работает, за исключением того, что я вижу, что изображения все еще мерцают. И даже иногда отображается неправильное изображение.
public void fetchDrawableOnThread(final String urlString, final ImageView imageView) {
if (imageView != null && urlString != null && urlString.length() > 0)
{
imageView.setTag(urlString);
final Handler handler = new Handler() {
@Override
public void handleMessage(Message message) {
Drawable d = imageView.getDrawable();
if(d != null){
((BitmapDrawable)imageView.getDrawable()).getBitmap().recycle();
imageView.setImageBitmap(null);
}
imageView.setImageDrawable((Drawable) message.obj);
}
};
Thread thread = new Thread() {
@Override
public void run() {
if (imageView != null && urlString != null && !urlString.equals(""))
{
URL url;
try {
if (imageView.getTag().equals(urlString))
{
InputStream is = fetch(urlString);
if (is != null) {
Drawable drawable = Drawable.createFromStream((InputStream)is, "src");
Message message = handler.obtainMessage(1, drawable);
handler.sendMessage(message);
}
}
}
catch (MalformedURLException e) {
Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
} catch (IOException e) {
Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
}
}
}
};
thread.start();
}
}
private InputStream fetch(String urlString) throws MalformedURLException, IOException {
if (urlString != null)
{
URL url = new URL(urlString);
URLConnection connection = url.openConnection();
connection.setUseCaches(true);
Object response = connection.getContent();
if (response instanceof InputStream) {
return (InputStream) response;
}
}
return null;
}