Soru ListView'de görüntülerin tembel yükü


Kullanıyorum ListView Bu resimlerle ilişkili bazı görüntüleri ve altyazıları görüntülemek için İnternetten görüntüler alıyorum. Metinleri görüntülerken, UI kilitlenmediğinde ve resimler indirildikçe görüntülenecek şekilde temsili yüklemek için bir yol var mı?

Toplam görüntü sayısı sabit değil.


1733
2018-02-12 15:59


Menşei


Kullanabilirsiniz GreenDroid Kullanıcı AsyncImageView. Sadece ara setUrl. - Pascal Dimassimo
Onu kullandım. Bu harika bir uygulama. AsyncImageView, büyük bir GreenDroid projesinin bir parçası olduğundan, ihtiyacınız olan durumda bile uygulamanızı daha da büyüten kötü haberler AsyncImageView. Ayrıca, GreenDroid projesi 2011'den beri güncellenmemektedir. - borisstr
Bu kütüphaneye bir deneme bile yapabilirsiniz: Android http-görüntü-yönetici Bence görüntülerin asenkron yükleme için en iyisi. - Ritesh Kumar Dubey
Sadece Picasso'yu kullan, tüm kendini yapacak. 'Picasso.with (sizin Metin) .load (burada img src / yol / çizilebilir) .into (imageView i.e hedefiniz);' Bu kadar! - Anuj Sharma
kullanmayı deneyin:github.com/nostra13/Android-Universal-Image-Loader Bu kütüphane tembel yükleme ve görüntü önbelleklemesi için çok hızlı ve verimlidir - krunal patel


Cevaplar:


Uygulamamın şu anda görüntülediği resimleri tutmak için hazırladım. Lütfen burada kullanılan "Log" nesnesinin, Android içindeki son Log sınıfının etrafındaki özel ambalajım olduğunu unutmayın.

package com.wilson.android.library;

/*
 Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
*/
import java.io.IOException;

public class DrawableManager {
    private final Map<String, Drawable> drawableMap;

    public DrawableManager() {
        drawableMap = new HashMap<String, Drawable>();
    }

    public Drawable fetchDrawable(String urlString) {
        if (drawableMap.containsKey(urlString)) {
            return drawableMap.get(urlString);
        }

        Log.d(this.getClass().getSimpleName(), "image url:" + urlString);
        try {
            InputStream is = fetch(urlString);
            Drawable drawable = Drawable.createFromStream(is, "src");


            if (drawable != null) {
                drawableMap.put(urlString, drawable);
                Log.d(this.getClass().getSimpleName(), "got a thumbnail drawable: " + drawable.getBounds() + ", "
                        + drawable.getIntrinsicHeight() + "," + drawable.getIntrinsicWidth() + ", "
                        + drawable.getMinimumHeight() + "," + drawable.getMinimumWidth());
            } else {
              Log.w(this.getClass().getSimpleName(), "could not get thumbnail");
            }

            return drawable;
        } catch (MalformedURLException e) {
            Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
            return null;
        } catch (IOException e) {
            Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
            return null;
        }
    }

    public void fetchDrawableOnThread(final String urlString, final ImageView imageView) {
        if (drawableMap.containsKey(urlString)) {
            imageView.setImageDrawable(drawableMap.get(urlString));
        }

        final Handler handler = new Handler() {
            @Override
            public void handleMessage(Message message) {
                imageView.setImageDrawable((Drawable) message.obj);
            }
        };

        Thread thread = new Thread() {
            @Override
            public void run() {
                //TODO : set imageView to a "pending" image
                Drawable drawable = fetchDrawable(urlString);
                Message message = handler.obtainMessage(1, drawable);
                handler.sendMessage(message);
            }
        };
        thread.start();
    }

    private InputStream fetch(String urlString) throws MalformedURLException, IOException {
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpGet request = new HttpGet(urlString);
        HttpResponse response = httpClient.execute(request);
        return response.getEntity().getContent();
    }
}

1017
2018-02-18 03:56



SoftReferences'ı kullanmanız gerektiğini düşünüyorum, böylece programınız OutOfMemoryException'a asla neden olmayacaktır. GC, yığın boyutu arttığında softreferences'ı temizleyebildiğinden ... kendi jenerasyonunuzu yönetebilirsiniz, sanki birkaç saniye sonra resimlerinizi bu listeye koyabilirsiniz ve yüklemeden önce, eğer görüntü varsa o zaman onu tekrar indirmeyin. Bu listeden ve aynı zamanda softref listenize geri koyarak ve bazen de hardlistinizi temizleyebilirsiniz :) - AZ_
Google Shelves projesi, nasıl yapıldığına dair mükemmel bir örnek code.google.com/p/shelves - AZ_
DrawableMap görüntüyü getirdiğinde, getirme iş parçacığı başlatılmadan bir dönüşü özlüyor musunuz? - Karussell
Bu kodda birkaç sorun var. Öncelikle, bir bellek sızıntısına neden olacak olan Drawables'i önbelleğe almalısınız: stackoverflow.com/questions/7648740/... . İkincisi, önbellek kendini asla temizlemez, böylece sonsuza dek büyüyecek, başka bir bellek sızıntısı. - satur9nine
hakkında hiç kimse duymadı LRU Cache  developer.android.com/training/displaying-bitmaps/... - Muhammad Babar


ben yaptım tembel bir listenin basit bir demosu (GitHub'ta bulunan) resimlerle. Birilerine yardımcı olabilir. Arka plandaki görüntüdeki görüntüleri indirir. Görüntüler bir SD kartta ve bellekte önbelleğe alınmaktadır. Önbellek uygulaması çok basit ve demo için yeterli. Bellek tüketimini azaltmak için görüntüleri inSampleSize ile çözüyorum. Ayrıca geri dönüştürülmüş görünümleri doğru şekilde kullanmaya çalışıyorum.

Alt text


983
2018-06-18 08:04



Teşekkürler, projemin hemen her yerinde kodunuzun biraz değiştirilmiş bir sürümünü kullanıyorum: code.google.com/p/vimeoid/source/browse/apk/src/com/fedorvlasov/... - shaman.sir
Kimse Gilles Debunne tarafından alternatif olarak bakıldı. Gördüğüm iki büyük fark 1) SD kart bellek önbellekleme ve 2) bir iş parçacığı havuzu yerine AsyncTasks kullanımı. android-developers.blogspot.com/2010/07/... - Richard
Bir hata var, bazen kovuldu: 10-13 09: 58: 46.738: ERROR / AndroidRuntime (24250): Yakalanmamış işleyici: yakalanmamış istisna nedeniyle iş parçacığı ana çıkışı 10-13 09: 58: 46.768: ERROR / AndroidRuntime (24250) : java.lang.ArrayIndexOutOfBoundsException: Dizi endeksi aralık dışı: 0 10-13 09: 58: 46.768: ERROR / AndroidRuntime (24250): java.util.Vector.elementAt (Vector.java:331) 10-13 09: 58: 46.768: ERROR / AndroidRuntime (24250): java.util.Vector.get (Vector.java:445) 10-13 09: 58: 46.768: ERROR / AndroidRuntime (24250): com.my.app.image adresinde .ImageLoader $ PhotosQueue.Clean (ImageLoader.java:91) - Mikooos
Bu kodu kendi projenize eklemek isterseniz, benim gibi yeni başlayanlar için eklemede harici önbellek izinleri eklemelisiniz. Teşekkür ederim - Adam
@BruceHill En yeni kaynak kodunda hiç fotoğraf yok. Çok eski bir versiyon kullanıyor gibisiniz. - Fedor


Açık kaynak enstrüman öneririm Evrensel Görüntü Yükleyici. Orijinal olarak Fedor Vlasov'un projesine dayanıyor LazyList ve o zamandan beri büyük ölçüde geliştirildi.

  • Multithread görüntü yükleme
  • Geniş ayarlama ImageLoader'ın yapılandırması (thread yürütücüler, downlaoder, kod çözücü, bellek ve disk önbelleği, görüntü seçenekleri ve diğerleri)
  • Bellekte görüntü önbelleğe alma ve / veya aygıtın dosya sysytem (veya SD kart) olasılığı
  • Yükleme işlemini "dinleme" imkanı
  • Her görüntülü görüntülü aramayı ayrı seçeneklerle kişiselleştirme imkanı
  • Widget desteği
  • Android 2.0+ desteği


530
2017-12-19 13:53



eğer yaratıcısının harika bebeği (sadece bir kerelik bir çözüm değil) gibi davranıp koruduğu harika bir "görüntü yükleme" kodu arıyorsanız, büyük ups Nostra - AndroidGecko
Gerçekten harika iş, ama biraz benim liste görüşümde kalıyor. 'ImageLoader' yapısını en iyi şekilde gerçekleştirebilirseniz ... veya belki de 'DisplayImageOptions' olduğundan. - dinigo
Bu gridview'i çok seviyorum ama öğretici için kullanamam. Ben android yeni başlayan biriyim. Ben gridview hakkında uygulama yapıyorum ama benim uygulama hedefSdkVersion 15 oldu, bu yüzden arka planda iş parçacığı için Asynctask kullanmam gerekiyor. Bu ızgara görünümünü kullandım ama işe yaramıyor. targetSdkVersion 15'de nasıl kullanabilirim? - kongkea
Etiketle ayrı soru oluşturabilirsiniz [Genel görüntü yükleyici] - NOSTRA
Resmi android belgelerini okuduktan ve bu şeyleri kendim yapmaya çalıştıktan sonra, bu kütüphanenin sonuncusu tüm resim yüklemelerinin sonu olduğuna eminim. Yeteri kadar çekilemez. - Core


Performans için MultithreadingGilles Debunne tarafından hazırlanmış bir eğitim.

Bu Android Geliştiricileri Blog'undan. Önerilen kod şunları kullanır:

  • AsyncTasks.
  • Zor ve sınırlı bir beden FIFO cache.
  • Yumuşak, kolayca garbage collect-ed önbellek.
  • bir tutucudur  Drawable indirirken.

enter image description here


147
2017-08-12 11:07



Ama Android 2.2 (Froyo) üzerine kurulu ... - Adinia
2.1 de iyi çalışıyor. Sadece AndroidHttpClient kullanmayın. - Thomas Ahle
@ thomas-ahle Teşekkür ederim, AndroidHttpClient'in 2,2'den itibaren olduğu gibi 2.1'de hatalar verdiğini gördüm, ancak gerçekten yerine başka bir şey bulmaya çalışmadım. - Adinia
@Adina Haklısın, unuttum. Bununla birlikte tarifte, normal bir HttpClient ile yapılmayacak hiçbir şey yoktur. - Thomas Ahle
Hala OOM kalıyor ... - Andro Selva


Güncelleme: Bu cevabın şu anda etkisiz olduğunu unutmayın. Çöp Toplayıcı, SoftReference ve WeakReference üzerinde agresif bir şekilde davranır, bu nedenle bu kod yeni uygulamalar için uygun DEĞİLDİR.  (Bunun yerine, Evrensel Görüntü Yükleyici diğer cevaplarda önerildi.)

Kod için James'e ve SoftReference kullanmanın önerisi için Bao-Long'a teşekkürler. James'in kodundaki SoftReference değişikliklerini uyguladık. Ne yazık ki SoftReferences, resimlerimin çok hızlı toplanmasına neden oldu. Benim durumumda SoftReference olayı olmadan iyiydi, çünkü liste boyutum sınırlı ve resimlerim küçük.

Bir yıl önce, Google Gruplarındaki SoftReferences ile ilgili bir tartışma var: iş parçacığına bağlantı. Çok erken bir çöp toplama çözümüne bir çözüm olarak, VM yığını boyutunun, bana çok çekici olmayan dalvik.system.VMRuntime.setMinimumHeapSize () yöntemini kullanarak manuel olarak ayarlama olasılığını öneriyorlar.

public DrawableManager() {
    drawableMap = new HashMap<String, SoftReference<Drawable>>();
}

public Drawable fetchDrawable(String urlString) {
    SoftReference<Drawable> drawableRef = drawableMap.get(urlString);
    if (drawableRef != null) {
        Drawable drawable = drawableRef.get();
        if (drawable != null)
            return drawable;
        // Reference has expired so remove the key from drawableMap
        drawableMap.remove(urlString);
    }

    if (Constants.LOGGING) Log.d(this.getClass().getSimpleName(), "image url:" + urlString);
    try {
        InputStream is = fetch(urlString);
        Drawable drawable = Drawable.createFromStream(is, "src");
        drawableRef = new SoftReference<Drawable>(drawable);
        drawableMap.put(urlString, drawableRef);
        if (Constants.LOGGING) Log.d(this.getClass().getSimpleName(), "got a thumbnail drawable: " + drawable.getBounds() + ", "
                + drawable.getIntrinsicHeight() + "," + drawable.getIntrinsicWidth() + ", "
                + drawable.getMinimumHeight() + "," + drawable.getMinimumWidth());
        return drawableRef.get();
    } catch (MalformedURLException e) {
        if (Constants.LOGGING) Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
        return null;
    } catch (IOException e) {
        if (Constants.LOGGING) Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
        return null;
    }
}

public void fetchDrawableOnThread(final String urlString, final ImageView imageView) {
    SoftReference<Drawable> drawableRef = drawableMap.get(urlString);
    if (drawableRef != null) {
        Drawable drawable = drawableRef.get();
        if (drawable != null) {
            imageView.setImageDrawable(drawableRef.get());
            return;
        }
        // Reference has expired so remove the key from drawableMap
        drawableMap.remove(urlString);
    }

    final Handler handler = new Handler() {
        @Override
        public void handleMessage(Message message) {
            imageView.setImageDrawable((Drawable) message.obj);
        }
    };

    Thread thread = new Thread() {
        @Override
        public void run() {
            //TODO : set imageView to a "pending" image
            Drawable drawable = fetchDrawable(urlString);
            Message message = handler.obtainMessage(1, drawable);
            handler.sendMessage(message);
        }
    };
    thread.start();
}

102
2018-05-05 13:16



Sert jenerasyon ve yumuşak jenerasyon gibi nesiller yaratabilirsiniz. Bir süreyi düzeltebilir net bir önbellek 3 saniye içinde erişilemeyen tüm görüntüleri temizler .. google raf projesine bir göz atabilirsiniz - AZ_
developer.android.com/reference/java/lang/ref/... SoftReference belgesinin önbelleğe alma hakkında bir notu vardır, bkz. "Önbelleğe Alma için Yumuşak Referanslardan Kaçının" bölümü. Çoğu uygulama, yumuşak referanslar yerine bir android.util.LruCache kullanmalıdır. - vokilam
Kodunuza hayranım ama şimdi yeni Android O / S'de 'agresif' çöp toplama var. Zayıf referansa sahip olmak bana bir şey ifade etmiyor. - j2emanue
@ j2emanue Haklısın, cevabımın en üstünde belirttiğim gibi, SoftReferences çok çabuk toplanan çöplerdir. Bunu daha da açık hale getirmek için bu cevabı düzenlemeye çalışacağım. - TalkLittle


Picasso 

Jake Wharton'un Picasso Kütüphanesini kullan. (Perfect ImageLoading Library, ActionBarSherlock geliştiricisini oluşturur)

Android için güçlü bir resim indirme ve önbellekleme kütüphanesi.

Görüntüler, Android uygulamalarına çok ihtiyaç duyulan bağlam ve görsel yetenekleri ekler. Picasso uygulamanızda sorunsuz bir şekilde görüntü yüklemesine izin verir - çoğu zaman bir kod satırıyla!

Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);

Android'de görüntü yüklemesinin birçok yaygın tuzağı Picasso tarafından otomatik olarak ele alınır:

ImageView'ın geri dönüştürülmesi ve bir adaptörde iptalin yapılması. Minimal bellek kullanımı ile karmaşık görüntü dönüşümleri. Otomatik bellek ve disk önbellekleme.

Picasso Jake Wharton'ın Kütüphanesi

yarı ünlü

Glide, Android için medya kod çözme, bellek ve disk önbellekleme ve kaynak havuzlamasını basit ve kullanımı kolay bir ara yüze dönüştüren hızlı ve verimli bir açık kaynak medya yönetim çerçevesidir.

Glide, video fotoğraflarını, görüntüleri ve animasyonlu GIF'leri getirmeyi, çözmeyi ve görüntülemeyi destekler. Glide, geliştiricilerin neredeyse tüm ağ yığınlarına bağlanmasını sağlayan esnek bir api içerir. Varsayılan olarak Glide, özel bir HttpUrlConnection tabanlı yığın kullanır, ancak Google'ın Volley projesine veya Square'in OkHttp kitaplığına yardımcı program kitaplıklarını da ekler.

Glide.with(this).load("http://goo.gl/h8qOq7").into(imageView);

Glide'ın birincil odak noktası, görüntülerin herhangi bir türünü mümkün olduğunca düzgün ve hızlı bir şekilde kaydırmaktır, ancak Glide, uzak bir görüntüyü getirmeniz, yeniden boyutlandırmanız ve görüntülemeniz gereken hemen hemen her durumda etkilidir.

Kaydırma Resim Yükleme Kitaplığı

Facebook tarafından Fresco 

Fresco, Android uygulamalarında görüntüleri görüntülemek için güçlü bir sistemdir.

Fresco, görüntü yükleme ve görüntülemeyle ilgilenir, dolayısıyla yapmanız gerekmez. Ağdan, yerel depolama alanından veya yerel kaynaklardan görüntüler yükler ve görüntü gelene kadar bir yer tutucu görüntüler. İki önbellek seviyesi vardır; biri bellekte ve diğeri dahili depolamada.

Fresco Github

Android 4.x ve daha düşük sürümlerde, Fresco görüntüleri Android belleğinin özel bir bölgesine yerleştirir. Bu, uygulamanızın daha hızlı çalışmasına izin verir ve korkulan OutOfMemoryError'a çok daha az sıklıkta uğrar.

Fresco Belgeleri


84
2018-04-04 12:35



Picasso, Square tarafından geliştirilen bir kütüphanedir. - LordRaydenMK


Yüksek performanslı yükleyici - burada önerilen yöntemleri inceledikten sonra, kullandım Ben'in çözümü bazı değişikliklerle -

  1. Çizilebilirlik ile çalışmanın bitmapler ile daha hızlı olduğunu fark ettim, bunun yerine bunun yerine çizim yapabilirim.

  2. SoftReference'ı kullanmak harikadır, ancak önbelleğe alınan görüntülerin çok sık silinmesini sağlar, bu yüzden önceden tanımlanmış bir boyuta ulaşana kadar resim referanslarını saklayan ve resimden silinmesini engelleyen Bağlantılı bir liste ekledim.

  3. InputStream'i açmak için web önbelleğini kullanmamı sağlayan java.net.URLConnection'ı kullandım (önce bir yanıt önbelleği ayarlamanız gerekir, ancak bu başka bir hikaye)

Kodum:

import java.util.Map; 
import java.util.HashMap; 
import java.util.LinkedList; 
import java.util.Collections; 
import java.util.WeakHashMap; 
import java.lang.ref.SoftReference; 
import java.util.concurrent.Executors; 
import java.util.concurrent.ExecutorService; 
import android.graphics.drawable.Drawable;
import android.widget.ImageView;
import android.os.Handler;
import android.os.Message;
import java.io.InputStream;
import java.net.MalformedURLException; 
import java.io.IOException; 
import java.net.URL;
import java.net.URLConnection;

public class DrawableBackgroundDownloader {    

private final Map<String, SoftReference<Drawable>> mCache = new HashMap<String, SoftReference<Drawable>>();   
private final LinkedList <Drawable> mChacheController = new LinkedList <Drawable> ();
private ExecutorService mThreadPool;  
private final Map<ImageView, String> mImageViews = Collections.synchronizedMap(new WeakHashMap<ImageView, String>());  

public static int MAX_CACHE_SIZE = 80; 
public int THREAD_POOL_SIZE = 3;

/**
 * Constructor
 */
public DrawableBackgroundDownloader() {  
    mThreadPool = Executors.newFixedThreadPool(THREAD_POOL_SIZE);  
}  


/**
 * Clears all instance data and stops running threads
 */
public void Reset() {
    ExecutorService oldThreadPool = mThreadPool;
    mThreadPool = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
    oldThreadPool.shutdownNow();

    mChacheController.clear();
    mCache.clear();
    mImageViews.clear();
}  

public void loadDrawable(final String url, final ImageView imageView,Drawable placeholder) {  
    mImageViews.put(imageView, url);  
    Drawable drawable = getDrawableFromCache(url);  

    // check in UI thread, so no concurrency issues  
    if (drawable != null) {  
        //Log.d(null, "Item loaded from mCache: " + url);  
        imageView.setImageDrawable(drawable);  
    } else {  
        imageView.setImageDrawable(placeholder);  
        queueJob(url, imageView, placeholder);  
    }  
} 


private Drawable getDrawableFromCache(String url) {  
    if (mCache.containsKey(url)) {  
        return mCache.get(url).get();  
    }  

    return null;  
}

private synchronized void putDrawableInCache(String url,Drawable drawable) {  
    int chacheControllerSize = mChacheController.size();
    if (chacheControllerSize > MAX_CACHE_SIZE) 
        mChacheController.subList(0, MAX_CACHE_SIZE/2).clear();

    mChacheController.addLast(drawable);
    mCache.put(url, new SoftReference<Drawable>(drawable));

}  

private void queueJob(final String url, final ImageView imageView,final Drawable placeholder) {  
    /* Create handler in UI thread. */  
    final Handler handler = new Handler() {  
        @Override  
        public void handleMessage(Message msg) {  
            String tag = mImageViews.get(imageView);  
            if (tag != null && tag.equals(url)) {
                if (imageView.isShown())
                    if (msg.obj != null) {
                        imageView.setImageDrawable((Drawable) msg.obj);  
                    } else {  
                        imageView.setImageDrawable(placeholder);  
                        //Log.d(null, "fail " + url);  
                    } 
            }  
        }  
    };  

    mThreadPool.submit(new Runnable() {  
        @Override  
        public void run() {  
            final Drawable bmp = downloadDrawable(url);
            // if the view is not visible anymore, the image will be ready for next time in cache
            if (imageView.isShown())
            {
                Message message = Message.obtain();  
                message.obj = bmp;
                //Log.d(null, "Item downloaded: " + url);  

                handler.sendMessage(message);
            }
        }  
    });  
}  



private Drawable downloadDrawable(String url) {  
    try {  
        InputStream is = getInputStream(url);

        Drawable drawable = Drawable.createFromStream(is, url);
        putDrawableInCache(url,drawable);  
        return drawable;  

    } catch (MalformedURLException e) {  
        e.printStackTrace();  
    } catch (IOException e) {  
        e.printStackTrace();  
    }  

    return null;  
}  


private InputStream getInputStream(String urlString) throws MalformedURLException, IOException {
    URL url = new URL(urlString);
    URLConnection connection;
    connection = url.openConnection();
    connection.setUseCaches(true); 
    connection.connect();
    InputStream response = connection.getInputStream();

    return response;
}
}

77
2017-12-27 23:27



Harika çalışıyor! BTW sınıf adında bir yazım hatası var. - Mullins
Bir başkasının zamanını kurtarması durumunda: import java.util.Map; import java.util.HashMap; import java.util.LinkedList; import java.util.Collections; import java.util.WeakHashMap; import java.lang.ref.SoftReference; import java.util.concurrent.Executors; import java.util.concurrent.ExecutorService; import android.graphics.drawable.Drawable; import android.widget.ImageView; import android.os.Handler; import android.os.Message; import java.io.InputStream; import java.net.MalformedURLException; import java.io.IOException; import java.net.URL; import java.net.URLConnection; - Michael Reed
Çok teşekkürler, bu güzel bir uygulama. Ayrıca, çekilebildiği zaman kullanıcı için geri bildirim alabilmesi için farklı bir yer tutucu koydum. - Juan Hernandez
Ayrıca, varsayılan FIFO yerine executorService (mThreadPool) içinde bir LIFO kuyruğu kullanmak daha iyi olduğunu düşünüyorum, bu nedenle (belki de görünür olanlardır) istenen görüntüleri ilk yüklenir. Görmek stackoverflow.com/questions/4620061/how-to-create-lifo-executor - Juan Hernandez
@MichaelReed, bir Eclipse kullanıcısı olmanız durumunda, Ctrl-Shift-O kullanmanızı öneririm (bu O harfi, 0 sayısı değil). İthalat ekleme sürecini otomatikleştirir ve sizin için düzenler. Mac kullanıyorsanız, bunun yerine Command-Shift-O kullanın. - SilithCrowe


Bu Android Eğitimini takip ettim ve ana kullanıcı arayüzünü engellemeden görüntüleri indirmenin mükemmel bir iş olduğunu düşünüyorum. Ayrıca, birçok görüntüde gezinerek önbelleğe alma ve işlem yapmayı da ele alır: Büyük Bitmap'leri Verimli Bir Şekilde Yükleme


75
2018-05-22 06:00



Üzgünüz, sadece Google IO uygulaması için tek bir sınıfa işaret ettim (ve düzenlemek için çok geç kaldım). Bulunduğunuz tüm resim yüklemelerini ve önbellekleme sınıflarını gerçekten öğrenmelisiniz. önbellek sınıfı ile aynı paket. - mkuech
Liste görünümü için görüntü yükleme / önbelleğe alma işleminde yardımcı olmak için Diskleykache, Resim * .java dosyalarını iosched uygulamasının kullanım klasöründen yakalamanızı tavsiye eder misiniz? Demek istediğim, konuyla ilgili online Geliştirici kılavuzlarını takip etmeye kesinlikle değer ama bu sınıflar (iosched'den) modelle biraz daha ileri gider. - Gautam


1.  Picasso uygulamanızda sorunsuz bir şekilde görüntü yüklemesine izin verir - çoğu zaman bir kod satırıyla!

Gradle kullan:

implementation 'com.squareup.picasso:picasso:2.71828'

Sadece bir satır kod!

Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(imageView);

2.  yarı ünlü Android için bir görüntü yükleme ve önbellek kütüphanesi

Gradle kullan:

repositories {
  mavenCentral() 
  google()
}

dependencies {
   implementation 'com.github.bumptech.glide:glide:4.7.1'
   annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'
}

// Basit bir görünüm için:

  Glide.with(this).load("http://i.imgur.com/DvpvklR.png").into(imageView);

3.  fresk  Android'de görüntüleri görüntülemek için güçlü bir sistem    applications.Fresco, resim yükleme ve görüntülemeyle ilgilenir;   için.

Fresco'ya Başlarken


56
2017-08-27 12:54



Bu eğitim size PICASOO için daha fazla yardımcı olabilir: - androidtutorialshub.com/... ve GLIDE: - androidtutorialshub.com/... - lalit vasan


Bir liste görünümünde görüntülerin tembel yükleme nasıl yapılacağını açıklayan bir öğretici yazdım. Geri dönüşüm ve eşzamanlılık sorunları hakkında bazı ayrıntılara giriyorum. Ayrıca çok sayıda iş parçacığı oluşmasını önlemek için sabit bir iş parçacığı havuzu kullanıyorum.

Listview Öğreticisinde görüntülerin tembel yüklenmesi


50
2018-02-12 20:07





Yaptığım şekilde arka plandaki görüntüleri indirmek ve her liste öğesi için bir geri bildirimi vermek için bir iş parçacığı başlatılmasıdır. Bir görüntü indirilirken, liste öğesi için görünümü güncelleyen geri arama çağırır.

Ancak, bu yöntem görünümleri geri dönüştürürken çok iyi sonuç vermez.


38
2017-12-14 10:57



Her görüntü için bir iş parçacığı kullanmak da benim kullandığım yaklaşımdır. Modelinizi görünümünüzden ayırırsanız, önbelleği saklamak için etkinliği ('uygulama' sınıfınızda olduğu gibi) Etkinlik dışında da sürebilirsiniz. Çok sayıda resminiz varsa, kaynakların tükenmesine dikkat edin. - James A Wilson
lütfen detaylandırır mısın? Ben android geliştirme için yeniyim. İpuçları için teşekkürler - lostInTransit
Her görüntü için yeni bir konu başlatmak etkili bir çözüm değildir. Bellekte çok fazla iş parçacığı ve donma UI ile son bulabilirsin. - Fedor
Fedor, kabul etti, genellikle bir kuyruk ve bir iş parçacığı havuzu kullanırım, bu imo'ya gitmenin en iyi yoludur. - jasonhudgins