Vorwort
Tatsächlich kann ich nach einer Woche der Einreise die beiden Brüder entwickeln, um Android zu entwickeln. Vor kurzem war ich mit der Chance, zusammenzufassen.
Prinzip
Die Prinzipien des Ladens von Bildern in ListView oder GridView sind im Grunde genommen gleich:
Nehmen Sie es aus dem Speichercache und geben Sie es zurück.
Das Flussdiagramm lautet wie folgt:
Achten Sie gleichzeitig auf die Anzahl der Threads. Wenn Sie Bilder in ListView laden, öffnet jeder neue Threads zum Laden, aber wenn es schnell gleitet, ist es einfach, OOM zu verursachen, sodass die Anzahl der Threads gesteuert werden muss. Wir können die Anzahl der Threads über den Thread -Pool steuern.
Die Methode zur Festlegung eines Threadpools lautet wie folgt:
ExecutorService ExecutorService = Executors.NetFixedThreadpool (5); // 5 ist variabel
Datei -Cache -Klasse
Java.io.file importieren. Os.Environment.getExternalStoragestate (). ) {CacheDir.mkders ();}} öffentliche Datei getFile (String url) {// Bilder nach URL -Hash -Code -String -Dateiname = string.ValueOf (url.hashcode ()); ; Speichercache -Klasse
Hier ist eine weiche Referenz, Karte <String, Softreference <Bitmap >> Cache, Sie können einen sanften Referenzmechanismus googeln.
Java.Lang.Ref.SofTreferation; Sammlungen Ref.Get ();} public void put (String -ID, Bitmap Bitmap) {cache.put (ID, neue SofTreference <Bit -Karte> (Bitmap);} public void clear () {cache.clear ();}}Bildladungsklasse
Java.io.file Java.IO.FileStream; utilections; .Bitmapfactory; Image Cache * / MemoryCache MemoryCache = new memoryCache (); SynchronizedMap (neuer WeedHasMap <ImageView, String> ()); {filecache = neuer Filecache (Kontext) ;; Bild von Memory Cache ImageView.setImageBitMap (Bitmap);} else {// Anzeige aus Datei -Cache oder Netzwerk -Queuephoto (URL, ImageV IEW);}} private void queuePhoto (String url, ImageView) {PhotoToLoad PhotoLoad = New PhotOtoad (Url (Url) ImageView); {Return bmp;} // aus dem Netzwerk versuchen {bitmap bitmap = null; (true); oder .Read (Bytes, 0, Buffer_size); F) {try {// todo: compress bildgröße fileInputstream = new FileInputStream (f); {MEMALYCACHE.CLEAR (); URL, ImageView ImageView) {this.url = url; ) {This.photOtoload = phototOtoad;} private boolean imageViewReut (Phototoload Photoload) {String tag = ImageViews.get (Phototoload.im.im.im.im.im.im.im ayview); ||! bitmap bitmap = getbitmap (PhototOtoad.Url); BitmapDisplayer (Bitmap, Phototoload); @Override public void run () {if (imageViewReut (phototOload)) {return;} if (bitmap! }}Anrufmethode
Imageloader Imageloader = New Imageloader (Kontext);