android - ListView মধ্যে ইমেজ Lazy লোড




image url (20)

আমি কিছু ছবি এবং ক্যাপশনগুলি সেই চিত্রগুলির সাথে যুক্ত করার জন্য একটি তালিকা ListView ব্যবহার করছি। আমি ইন্টারনেট থেকে ছবি পাচ্ছি। পাঠ্য প্রদর্শনের সময় ইমেজগুলি অলস লোড করার উপায় আছে কি না, UI টি লক করা নেই এবং ডাউনলোড করা হয় এমন চিত্রগুলি প্রদর্শিত হয়?

ইমেজ মোট সংখ্যা সংশোধন করা হয় না।


আচ্ছা, ইন্টারনেট থেকে ইমেজ লোডিং সময় অনেক সমাধান আছে। আপনি লাইব্রেরি Android-Query ব্যবহার করতে পারেন। এটা আপনি সব প্রয়োজনীয় কার্যকলাপ দিতে হবে। আপনি কি করতে চান তা নিশ্চিত করুন এবং লাইব্রেরি উইকি পৃষ্ঠাটি পড়ুন। এবং ইমেজ লোডিং সীমাবদ্ধতা সমাধান।

এই আমার কোড:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    if (v == null) {
        LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.row, null);
    }

    ImageView imageview = (ImageView) v.findViewById(R.id.icon);
    AQuery aq = new AQuery(convertView);

    String imageUrl = "http://www.vikispot.com/z/images/vikispot/android-w.png";

    aq.id(imageview).progress(this).image(imageUrl, true, true, 0, 0, new BitmapAjaxCallback() {
        @Override
        public void callback(String url, ImageView iv, Bitmap bm, AjaxStatus status) {
            iv.setImageBitmap(bm);
        }
    ));

    return v;
}

এটা আপনার অলস লোডিং সমস্যা সমাধান করা উচিত।


আমার অ্যাপ্লিকেশনটি বর্তমানে প্রদর্শিত হচ্ছে এমন চিত্রগুলি ধরে রাখার জন্য আমি যা তৈরি করেছি তা এখানে। দয়া করে নোট করুন যে এখানে "লগ" অবজেক্টটি Android এর ভিতরে চূড়ান্ত লগ ক্লাসের কাছাকাছি আমার কাস্টম wrapper।

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();
    }
}

আমি এই অ্যান্ড্রয়েড প্রশিক্ষণ অনুসরণ করেছি এবং আমি মনে করি এটি মূল UI ব্লক না করে ছবি ডাউনলোড করার একটি চমৎকার কাজ করে। এটি অনেকগুলি চিত্রের মাধ্যমে স্ক্রোলিংয়ের সাথে ক্যাশিং এবং ডিলিং পরিচালনা করে: কার্যকরীভাবে বড় বিটম্যাপ লোড হচ্ছে


আমি একটি টিউটোরিয়াল লিখেছি যা লিস্টভিউতে চিত্রগুলির অলস লোডিং কিভাবে করে তা ব্যাখ্যা করে। আমি পুনর্ব্যবহারযোগ্য এবং concurrency বিষয় সম্পর্কে কিছু বিস্তারিত মধ্যে যান। আমি থ্রেড অনেক spawning প্রতিরোধ করার জন্য একটি নির্দিষ্ট থ্রেড পুল ব্যবহার।

Listview টিউটোরিয়াল ইমেজ Lazy লোড হচ্ছে


আমি নতুন অ্যান্ড্রয়েড ভলি লাইব্রেরি com.android.volley.toolbox.NetworkImageView থেকে NetworkImageView ব্যবহার করছি, এবং এটি বেশ ভাল কাজ করছে বলে মনে হচ্ছে। দৃশ্যত, এটি একই দৃশ্য যা Google Play এবং অন্যান্য নতুন Google অ্যাপ্লিকেশনগুলিতে ব্যবহৃত হয়। চেক আউট নিশ্চিতভাবে মূল্য।


আমি শুধু আরো একটি ভাল উদাহরণ, এক্সএমএল অ্যাডাপ্টার যোগ করতে চান। এটি Google দ্বারা ব্যবহৃত হয় এবং আমিও আউটঅফমিমেরি ত্রুটিটি এড়াতে একই যুক্তি ব্যবহার করছি।

মূলত এই ইমেজডাউনলোডার আপনার উত্তর (যেমন এটি আপনার প্রয়োজনীয়তা জুড়ে)। কিছু আপনি যে বাস্তবায়ন করতে পারেন।


পটভূমির চিত্রগুলি ডাউনলোড করতে এবং প্রতিটি তালিকা আইটেমের জন্য এটি একটি কলব্যাক হস্তান্তর করার জন্য আমি যা করি তা হল। যখন একটি চিত্র ডাউনলোড করা শেষ হয় তখন এটি কলব্যাক কল করে যা তালিকা আইটেমের জন্য দৃশ্য আপডেট করে।

যদিও আপনি পুনর্ব্যবহারযোগ্য দৃষ্টিভঙ্গি যখন এই পদ্ধতি খুব ভাল কাজ করে না।


হাই কর্মক্ষমতা লোডার - এখানে প্রস্তাবিত পদ্ধতি পরীক্ষা করার পরে, আমি কিছু পরিবর্তন সঙ্গে বেন এর সমাধান ব্যবহার -

  1. আমি বুঝতে পেরেছি যে দ্রাক্ষারসগুলির সাথে কাজ করাটি দ্রুত বিটম্যাপগুলির সাথে তাই আমি পরিবর্তে দ্রাব্য ব্যবহার করি

  2. সফট রেফারেন্স ব্যবহার করা খুব ভাল, তবে এটি ক্যাশেড চিত্রটিকে প্রায়শই মুছে ফেলতে দেয়, তাই আমি একটি লিঙ্কযুক্ত তালিকা যুক্ত করে যা চিত্রের রেফারেন্সগুলি ধরে রাখে, চিত্রটি মুছে ফেলার বাধা দেয় না, যতক্ষণ না এটি পূর্বনির্ধারিত আকারে পৌঁছে যায়।

  3. ইনপুটস্ট্রীমটি খুলতে আমি java.net.URL সংযোগ ব্যবহার করি যা আমাকে ওয়েব ক্যাশে ব্যবহার করতে দেয় (আপনাকে প্রথমে একটি প্রতিক্রিয়া ক্যাশ সেট করতে হবে তবে এটি অন্য একটি গল্প)

আমার কোড:

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;
}
}

DroidParts এর ImageFetcher যা শুরু করতে শূন্য কনফিগারেশন প্রয়োজন।

  • একটি ডিস্ক এবং ইন-মেমরি লিস্ট সাম্প্রতিক ব্যবহৃত (LRU) ক্যাশ ব্যবহার করে।
  • কার্যকরীভাবে ডিকোড ইমেজ।
  • ব্যাকগ্রাউন্ড থ্রেডে বিটম্যাপ সংশোধন সমর্থন করে।
  • সহজ ক্রস ফেইড আছে।
  • ইমেজ লোডিং অগ্রগতি callback আছে।

উদাহরণস্বরূপ ক্লোনের DroidPartsGram :


URLImageViewHelper একটি অসাধারণ লাইব্রেরি যা আপনাকে এটি করতে সহায়তা করে।


আপডেট: এই উত্তরটি এখন বেশ কার্যকর নয়। গার্বেজ কালেক্টর সফট রেফারেন্স এবং ওয়েক রেফারেন্সে আক্রমণাত্মকভাবে কাজ করে, তাই এই কোডটি নতুন অ্যাপ্লিকেশনের জন্য উপযুক্ত নয়। (পরিবর্তে, অন্যান্য উত্তরগুলিতে প্রস্তাবিত github.com/nostra13/Android-Universal-Image-Loader মতো লাইব্রেরিগুলি চেষ্টা করুন।)

কোডের জন্য জেমসকে ধন্যবাদ, এবং সফ্ট রেফারেন্স ব্যবহার করার পরামর্শের জন্য বাও-লং। আমি জেমস কোড উপর সফট রেফারেন্স পরিবর্তন বাস্তবায়িত। দুর্ভাগ্যবশত নরম রেফারেন্সগুলি আমার ছবিগুলি খুব দ্রুত সংগ্রহ করা আবর্জনা হতে পারে। আমার ক্ষেত্রে এটি softfeference স্টাফ ছাড়া ভাল ছিল, কারণ আমার তালিকা আকার সীমিত এবং আমার ছবি ছোট।

গুগল গ্রুপের সফট রেফারেন্স সম্পর্কিত একটি বছর আগে একটি আলোচনা হয়েছে: থ্রেড লিঙ্ক । খুব প্রাথমিকভাবে আবর্জনা সংগ্রহের সমাধান হিসাবে, তারা dalvik.system.VMRuntime.setMinimumHeapSize () ব্যবহার করে ভিএম হিপ আকারটি ম্যানুয়ালি সেট করার সম্ভাবনা প্রস্তাব করে যা আমার কাছে খুব আকর্ষণীয় নয়।

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();
}

পিকাসো

জ্যাক ওয়ার্টন এর পিকাসো লাইব্রেরি ব্যবহার করুন। (একটি পারফেক্ট ইমেজ লোডিং লাইব্রেরি অ্যাকশনবারশলকের বিকাশকারী রূপ)

একটি শক্তিশালী ইমেজ ডাউনলোড এবং অ্যান্ড্রয়েড জন্য ক্যাশে লাইব্রেরি।

ইমেজ অ্যান্ড্রয়েড অ্যাপ্লিকেশন খুব প্রয়োজনীয় প্রসঙ্গ এবং চাক্ষুষ ফ্ল্যাশ যোগ করুন। পিকাসো আপনার অ্যাপ্লিকেশনে ঝামেলা মুক্ত ছবির লোডিংয়ের জন্য অনুমতি দেয় - প্রায়শই কোডের এক লাইনে!

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

Android এ ইমেজ লোডিংয়ের অনেক সাধারণ ক্ষতিগুলি স্বয়ংক্রিয়ভাবে পিকাসো দ্বারা পরিচালিত হয়:

ImageView পুনর্ব্যবহার পরিচালনা এবং একটি অ্যাডাপ্টারের মধ্যে বাতিল বাতিল। কম মেমরি ব্যবহার সঙ্গে জটিল ইমেজ রূপান্তর। স্বয়ংক্রিয় মেমরি এবং ডিস্ক ক্যাশিং।

পিকাসো জ্যাক হোয়ার্টন লাইব্রেরী

পিছলে পড়া

গ্লাইড একটি দ্রুত এবং কার্যকরী ওপেন সোর্স মিডিয়া পরিচালনার ফ্রেমওয়ার্ক, যা Android এর জন্য একটি সহজ এবং সহজে ব্যবহারযোগ্য ইন্টারফেসে মিডিয়া ডিকোডিং, মেমরি এবং ডিস্ক ক্যাশিং এবং সম্পদ পুলিংয়ের মোচন করে।

Glide fetching, decoding এবং ভিডিও স্টিল, চিত্র এবং অ্যানিমেটেড GIF গুলি প্রদর্শন করে। গ্লাইড একটি নমনীয় api যা ডেভেলপারদের প্রায় কোনো নেটওয়ার্ক স্ট্যাক প্লাগ করতে পারবেন। ডিফল্টরূপে গ্লাইড একটি কাস্টম HttpUrlConnection ভিত্তিক স্ট্যাক ব্যবহার করে, তবে এতে ইউটিলিটি লাইব্রেরীগুলিকে Google এর ভলি প্রকল্প বা স্কয়ারের OkHttp লাইব্রেরিতে প্লাগ ইন করে।

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

গ্লাইডের প্রাথমিক ফোকাস ইমেজগুলির যেকোনো ধরনের তালিকা যতটা সম্ভব মসৃণ এবং দ্রুত স্ক্রোল করার জন্য হয় তবে গ্লাইডটি এমন কোনও ক্ষেত্রে কার্যকর হয় যেখানে আপনাকে একটি দূরবর্তী চিত্রটি আনতে, আকার পরিবর্তন করতে এবং প্রদর্শন করতে হয়।

গ্লাইড ইমেজ লোড হচ্ছে লাইব্রেরি

ফেসবুক দ্বারা ফ্রেসকো

ফ্রেসকো Android অ্যাপ্লিকেশনগুলিতে চিত্রগুলি প্রদর্শনের জন্য একটি শক্তিশালী সিস্টেম।

ফ্রেস্কো ইমেজ লোডিং এবং ডিসপ্লে যত্ন নেয়, তাই আপনাকে করতে হবে না। এটি নেটওয়ার্ক, স্থানীয় সঞ্চয়স্থান, বা স্থানীয় সংস্থার চিত্রগুলি লোড করবে এবং চিত্রটি না আসা পর্যন্ত স্থানধারক প্রদর্শন করবে। এটা ক্যাশে দুই মাত্রা আছে; মেমরি এক এবং অভ্যন্তরীণ স্টোরেজ অন্য।

ফ্রেসকো গিথুব

অ্যান্ড্রয়েড 4.x এবং তার নীচে, ফ্রেস্কো অ্যানড্রইড মেমরির একটি বিশেষ অঞ্চলে চিত্রগুলি রাখে। এটি আপনার অ্যাপ্লিকেশনটি দ্রুত চালাতে দেয় - এবং ভয়ঙ্কর OutOfMemoryError অনেক কম প্রায়ই ভোগ করে।

ফ্রেস্কো ডকুমেন্টেশন


আমি একটি কবজ মত কাজ করে যে একটি ভিন্ন উপায় সুপারিশ করতে পারেন: অ্যান্ড্রয়েড প্রশ্ন।

আপনি here থেকে যে JAR ফাইল ডাউনলোড করতে পারেনhere

AQuery androidAQuery = new AQuery(this);

একটি উদাহরণ হিসাবে:

androidAQuery.id(YOUR IMAGEVIEW).image(YOUR IMAGE TO LOAD, true, true, getDeviceWidth(), ANY DEFAULT IMAGE YOU WANT TO SHOW);

এটি খুব দ্রুত এবং সঠিক, এবং এটি ব্যবহার করে আপনি লোড করার সময়, বিটম্যাপ (প্রয়োজন হলে), ইত্যাদির মতো আরো অনেক বৈশিষ্ট্য খুঁজে পেতে পারেন।


সব উপরে কোড তাদের নিজস্ব মূল্য আছে কিন্তু আমার ব্যক্তিগত অভিজ্ঞতা সঙ্গে শুধুমাত্র Picasso সঙ্গে একটি চেষ্টা করুন।

পিকাসো বিশেষভাবে এই উদ্দেশ্যে একটি লাইব্রেরি, প্রকৃতপক্ষে এটি স্বয়ংক্রিয়ভাবে ক্যাশে এবং অন্যান্য সমস্ত নেটওয়ার্ক ক্রিয়াকলাপ পরিচালনা করবে। আপনাকে আপনার প্রোজেক্টে লাইব্রেরি যোগ করতে হবে এবং দূরবর্তী URL থেকে চিত্র লোড করতে কোডের একটি লাইন লিখতে হবে।

অনুগ্রহ করে এখানে যান: http://code.tutsplus.com/tutorials/android-sdk-working-with-picasso--cms-22149


অ্যান্ড্রয়েডের অ্যাপ্লিডিয়ামের লাইটওয়েট SDWebImage (iOS- এ একটি চমৎকার লাইব্রেরি) Shutterbug এ দেখুন । এটি অ্যাসিঙ্ক্রোনাস ক্যাশিংকে সমর্থন করে, দোকানে ব্যর্থ URL গুলি, কনকুরেন্স ভালভাবে পরিচালনা করে এবং সহায়ক উপশ্রেণীগুলি অন্তর্ভুক্ত করা হয়।

অনুরোধ টানুন (এবং বাগ রিপোর্ট) খুব, স্বাগত জানাই!


আপনি এই ইউনিভার্সাল লোডার চেষ্টা করা উচিত সেরা। আমি অলস লোডিং অন অনেক RnD সম্পন্ন পরে এই ব্যবহার করছি।

github.com/nostra13/Android-Universal-Image-Loader

বৈশিষ্ট্য

  • মাল্টিথ্রেড চিত্র লোড হচ্ছে (async বা সিঙ্ক)
  • ইমেজ লোডারের কনফিগারেশন (থ্রেড নির্বাহক, ডাউনলোডার, ডিকোডার, মেমরি এবং ডিস্ক ক্যাশে, চিত্র চিত্র প্রদর্শন ইত্যাদি) এর ব্যাপক কাস্টমাইজেশন।
  • প্রতি ডিসপ্লে ইমেজ কলের জন্য অনেক কাস্টমাইজেশন অপশন (স্টবু ইমেজ, ক্যাচিং সুইচ, ডিকোডিং অপশন, বিটম্যাপ প্রক্রিয়াকরণ এবং প্রদর্শনের ইত্যাদি)
  • ইমেজ ক্যাশিং মেমরি এবং / অথবা ডিস্কে (ডিভাইসের ফাইল সিস্টেম বা এসডি কার্ড)
  • লোডিং প্রক্রিয়া শুনতে (অগ্রগতি ডাউনলোড সহ)

অ্যান্ড্রয়েড 2.0+ সমর্থন


আমি এই সমস্যা ছিল এবং lruCache বাস্তবায়িত। আমি আপনাকে API 12 এবং উপরে প্রয়োজন বা compatiblity v4 লাইব্রেরি ব্যবহার বিশ্বাস। lurCache দ্রুত মেমরি, কিন্তু এটি একটি বাজেট আছে, তাই আপনি যদি এটি সম্পর্কে চিন্তিত হন তবে আপনি ডিস্কক্যাচ ব্যবহার করতে পারেন ... এটি সমস্ত developer.android.com/training/displaying-bitmaps/… বর্ণিত ।

আমি এখন আমার বাস্তবায়ন প্রদান করব যা একটি singleton আমি যেকোনো জায়গা থেকে কল করি:

//Where the first is a string and the other is a imageview to load.

DownloadImageTask.getInstance().loadBitmap(avatarURL, iv_avatar);

এখানে ক্যাশে আদর্শ কোডটি এবং তারপরে ওয়েব চিত্রটি পুনরুদ্ধার করার সময় অ্যাডাপ্টারের getView এ উপরে কল করুন:

public class DownloadImageTask {

    private LruCache<String, Bitmap> mMemoryCache;

    /* Create a singleton class to call this from multiple classes */

    private static DownloadImageTask instance = null;

    public static DownloadImageTask getInstance() {
        if (instance == null) {
            instance = new DownloadImageTask();
        }
        return instance;
    }

    //Lock the constructor from public instances
    private DownloadImageTask() {

        // Get max available VM memory, exceeding this amount will throw an
        // OutOfMemory exception. Stored in kilobytes as LruCache takes an
        // int in its constructor.
        final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);

        // Use 1/8th of the available memory for this memory cache.
        final int cacheSize = maxMemory / 8;

        mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
            @Override
            protected int sizeOf(String key, Bitmap bitmap) {
                // The cache size will be measured in kilobytes rather than
                // number of items.
                return bitmap.getByteCount() / 1024;
            }
        };
    }

    public void loadBitmap(String avatarURL, ImageView imageView) {
        final String imageKey = String.valueOf(avatarURL);

        final Bitmap bitmap = getBitmapFromMemCache(imageKey);
        if (bitmap != null) {
            imageView.setImageBitmap(bitmap);
        } else {
            imageView.setImageResource(R.drawable.ic_launcher);

            new DownloadImageTaskViaWeb(imageView).execute(avatarURL);
        }
    }

    private void addBitmapToMemoryCache(String key, Bitmap bitmap) {
        if (getBitmapFromMemCache(key) == null) {
            mMemoryCache.put(key, bitmap);
        }
    }

    private Bitmap getBitmapFromMemCache(String key) {
        return mMemoryCache.get(key);
    }

    /* A background process that opens a http stream and decodes a web image. */

    class DownloadImageTaskViaWeb extends AsyncTask<String, Void, Bitmap> {
        ImageView bmImage;

        public DownloadImageTaskViaWeb(ImageView bmImage) {
            this.bmImage = bmImage;
        }

        protected Bitmap doInBackground(String... urls) {

            String urldisplay = urls[0];
            Bitmap mIcon = null;
            try {
                InputStream in = new java.net.URL(urldisplay).openStream();
                mIcon = BitmapFactory.decodeStream(in);

            } 
            catch (Exception e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }

            addBitmapToMemoryCache(String.valueOf(urldisplay), mIcon);

            return mIcon;
        }

        /* After decoding we update the view on the main UI. */
        protected void onPostExecute(Bitmap result) {
            bmImage.setImageBitmap(result);
        }
    }
}

আমি মনে করি এই সমস্যাটি অ্যান্ড্রয়েড ডেভেলপারদের মধ্যে খুব জনপ্রিয়, এবং এই ধরনের সমস্যাগুলি সমাধান করার দাবিতে প্রচুর সংখ্যক লাইব্রেরি রয়েছে, তবে তাদের মধ্যে কয়েকটিই কেবল চিহ্ন হিসাবে মনে হয়। AQuery একটি এমন লাইব্রেরি, তবে এটি সমস্ত দিকগুলির তুলনায় সর্বাধিক ভাল এবং এটির জন্য মূল্যবান।


দিন Android-Query ব্যবহার করে দেখুন। এটি অসীমভাবে লোড এবং ক্যাশে ইমেজ ক্যাশে আশ্চর্যজনক সহজ পদ্ধতি আছে।


নোভোডাও একটি দুর্দান্ত অলস ইমেজ লোডিং লাইব্রেরি এবং সাংকেতিক, পডিও, সিক্রেট ডিজে এবং ইমেজসার্চের মতো অনেক অ্যাপ্লিকেশন তাদের লাইব্রেরি ব্যবহার করে।

তাদের লাইব্রেরী here গিথবুতে হোস্ট করা here এবং তাদের পাশাপাশি তারা বেশ সক্রিয় বিষয় ট্র্যাকার রয়েছে। তাদের প্রকল্পটি খুবই সক্রিয় বলে মনে হচ্ছে, এই উত্তরটি লেখার সময় 300++ টিরও বেশি সময় আছে।





universal-image-loader