অ্যান্ড্রয়েড চিত্রের ক্যাচিং


উত্তর:


177

এবং এখন পাঞ্চলাইন: সিস্টেম ক্যাশে ব্যবহার করুন।

URL url = new URL(strUrl);
URLConnection connection = url.openConnection();
connection.setUseCaches(true);
Object response = connection.getContent();
if (response instanceof Bitmap) {
  Bitmap bitmap = (Bitmap)response;
} 

ব্রাউজারের সাথে ভাগ করা, মেমরি এবং ফ্ল্যাশ-রোম ক্যাশে উভয়ই সরবরাহ করে।

grr। আমার ইচ্ছা আমার নিজের ক্যাশে ম্যানেজার লেখার আগে কেউ আমাকে জানিয়েছিল।


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

11
connection.getContent()আমার জন্য সর্বদা একটি ইনপুট স্ট্রিম ফিরিয়ে দেয়, আমি কী ভুল করছি?
টাইলার কলিয়ার

3
আমি যদি এখন ক্যাশের সামগ্রীতে একটি মেয়াদোত্তীকরণের তারিখও নির্ধারণ করতে পারি তবে আমার জীবন এত সহজ হয়ে গেল :)
জানুস

11
@ সায়েন্সপ্রডিজি বিটম্যাপলডার কী তা জানেন না, অবশ্যই আমি যে কোনও স্ট্যান্ডার্ড অ্যান্ড্রয়েড লাইব্রেরিতে জানি না, তবে এটি কমপক্ষে আমাকে সঠিক দিকে নিয়ে গেছে। Bitmap response = BitmapFactory.decodeStream((InputStream)connection.getContent());
স্টিফেন ফুহরি

6
ক্যাশে কাজ করার জন্য আপনার নেওয়া অতিরিক্ত পদক্ষেপগুলি সম্পর্কে নীচে জোয়ের উত্তর দেখতে ভুলবেন না
কিথ

65

connection.setUseCachesউপরের মার্জিত সমাধান সম্পর্কে : দুঃখের বিষয়, এটি কিছু অতিরিক্ত প্রচেষ্টা ব্যতীত কাজ করবে না। আপনার একটি ResponseCacheব্যবহার ইনস্টল করতে হবে ResponseCache.setDefault। অন্যথায়, HttpURLConnectionনীরবে setUseCaches(true)কিছুটা উপেক্ষা করবে ।

FileResponseCache.javaবিস্তারিত জানার জন্য উপরের মন্তব্যগুলি দেখুন :

http://libs-for-android.googlecode.com/svn/reference/com/google/android/filecache/FileResponseCache.html

(আমি এটি একটি মন্তব্যে পোস্ট করব, তবে স্পষ্টতই আমার যথেষ্ট পরিমাণ SO কর্মফল নেই))



2
আপনি যখন কোনওটি ব্যবহার করেন HttpResponseCache, আপনি HttpResponseCache.getHitCount()ফিরে আসতে পারেন 0. যাইহোক ক্যাচিংয়ের কাজ করতে, ব্যবহার করুন connection.addRequestProperty("Cache-Control", "max-stale=" + MAX_STALE_CACHE);
অ্যালমার

1
গুগল কোডসার্ক লিঙ্কটি মারা গেছে (আবার?), দয়া করে লিঙ্কটি আপডেট করুন।
ফেলিক্স ডি

এছাড়াও, আমি নিশ্চিত নই যে এই আচরণটি এখন স্থির হয়েছে কিনা। কোনও কারণে সার্ভার থেকে 304 ফিরতে .getContent()পদ্ধতি ব্যবহার করার সময় এইচইউসি ঝুলবে কারণ 304 টি প্রতিক্রিয়া আরএফসি স্ট্যান্ডার্ডের সাথে সম্পর্কিত কোনও প্রতিক্রিয়া সংস্থার নয়।
TheRealChx101

27

এগুলি বিটম্যাপে রূপান্তর করুন এবং তারপরে সেগুলি সংগ্রহের (হ্যাশম্যাপ, তালিকা ইত্যাদি) স্টোর করুন বা আপনি এসডিকার্ডে লিখতে পারেন।

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

HashMap<String,SoftReference<Bitmap>> imageCache =
        new HashMap<String,SoftReference<Bitmap>>();

এগুলি এসডিকার্ডে লেখার জন্য পুনরায়লোডের প্রয়োজন হবে না; শুধু একটি ব্যবহারকারীর অনুমতি।


আমরা কীভাবে এসডি বা ফোনের মেমোরিতে চিত্রটি লিখতে পারি?
d-man

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

@ ডি-ম্যান আমি প্রথমে ডিস্কে লেখার পরামর্শ দিয়েছি এবং তারপরে Uriআপনি যে পথের রেফারেন্স ImageViewএবং অন্যান্য কাস্টম ভিউগুলিতে যেতে পারেন তা প্রাপ্ত করার পরামর্শ দেব । কারণ প্রতিবার আপনি compress, গুণমান হারাবেন। অবশ্যই এটি ক্ষতির অ্যালগোরিদমের জন্য সত্য true এই পদ্ধতিটি আপনাকে এমনকি ফাইলের একটি হ্যাশ সংরক্ষণ করার অনুমতি দেয় এবং পরের বার আপনি সার্ভার If-None-Matchএবং ETagহেডারগুলির মাধ্যমে ফাইলটির জন্য অনুরোধ করবেন ।
TheRealChx101

@ TheRealChx101 আপনি যদি আর-না-ম্যাচ এবং ইটাগ শিরোলেখগুলির মাধ্যমে সার্ভার থেকে ফাইলটির জন্য অনুরোধ করবেন তখন আপনি কী বোঝাতে চেয়েছিলেন দয়া করে বুঝতে সাহায্য করতে পারেন , আমি মূলত সমাধানের পদ্ধতির সন্ধান করছি যেখানে চিত্রটি স্থানীয় ক্যাশে হিসাবে সংজ্ঞায়িত করতে ব্যবহার করা উচিত পিরিয়ড বা যদি এটি অর্জন করা যায় না তবে যখনই ইউআরএল-এর সামগ্রীতে পরিবর্তন আসে, এটি সর্বশেষতমটির সাথে প্রয়োগ করে তা ক্যাশে করা উচিত।
CoDe

@ কোড এই মুহুর্তের জন্য এই লিঙ্কটি দেখুন, android.jlelse.eu/…
TheRealChx101

27

LruCacheদক্ষতার সাথে চিত্রগুলি ক্যাশে করতে ব্যবহার করুন । আপনি অ্যান্ড্রয়েড বিকাশকারী সাইটLruCache থেকে সম্পর্কে পড়তে পারেন

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

পদক্ষেপ 1: ক্লাস নামকরণ করুন ImagesCache। আমি ব্যবহার করেছিSingleton object for this class

import android.graphics.Bitmap;
import android.support.v4.util.LruCache;

public class ImagesCache 
{
    private  LruCache<String, Bitmap> imagesWarehouse;

    private static ImagesCache cache;

    public static ImagesCache getInstance()
    {
        if(cache == null)
        {
            cache = new ImagesCache();
        }

        return cache;
    }

    public void initializeCache()
    {
        final int maxMemory = (int) (Runtime.getRuntime().maxMemory() /1024);

        final int cacheSize = maxMemory / 8;

        System.out.println("cache size = "+cacheSize);

        imagesWarehouse = new LruCache<String, Bitmap>(cacheSize)
                {
                    protected int sizeOf(String key, Bitmap value) 
                    {
                        // The cache size will be measured in kilobytes rather than number of items.

                        int bitmapByteCount = value.getRowBytes() * value.getHeight();

                        return bitmapByteCount / 1024;
                    }
                };
    }

    public void addImageToWarehouse(String key, Bitmap value)
    {       
        if(imagesWarehouse != null && imagesWarehouse.get(key) == null)
        {
            imagesWarehouse.put(key, value);
        }
    }

    public Bitmap getImageFromWarehouse(String key)
    {
        if(key != null)
        {
            return imagesWarehouse.get(key);
        }
        else
        {
            return null;
        }
    }

    public void removeImageFromWarehouse(String key)
    {
        imagesWarehouse.remove(key);
    }

    public void clearCache()
    {
        if(imagesWarehouse != null)
        {
            imagesWarehouse.evictAll();
        }       
    }

}

ধাপ ২:

DownloadImageTask নামে অন্য একটি শ্রেণি তৈরি করুন যা ব্যবহৃত হয় যদি বিটম্যাপ ক্যাশে পাওয়া যায় না তবে এটি এখান থেকে ডাউনলোড করবে:

public class DownloadImageTask extends AsyncTask<String, Void, Bitmap>
{   
    private int inSampleSize = 0;

    private String imageUrl;

    private BaseAdapter adapter;

    private ImagesCache cache;

    private int desiredWidth, desiredHeight;

    private Bitmap image = null;

    private ImageView ivImageView;

    public DownloadImageTask(BaseAdapter adapter, int desiredWidth, int desiredHeight) 
    {
        this.adapter = adapter;

        this.cache = ImagesCache.getInstance();

        this.desiredWidth = desiredWidth;

        this.desiredHeight = desiredHeight;
    }

    public DownloadImageTask(ImagesCache cache, ImageView ivImageView, int desireWidth, int desireHeight)
    {
        this.cache = cache;

        this.ivImageView = ivImageView;

        this.desiredHeight = desireHeight;

        this.desiredWidth = desireWidth;
    }

    @Override
    protected Bitmap doInBackground(String... params) 
    {
        imageUrl = params[0];

        return getImage(imageUrl);
    }

    @Override
    protected void onPostExecute(Bitmap result) 
    {
        super.onPostExecute(result);

        if(result != null)
        {
            cache.addImageToWarehouse(imageUrl, result);

            if(ivImageView != null)
            {
                ivImageView.setImageBitmap(result);
            }
            else if(adapter != null)
            {
                adapter.notifyDataSetChanged();
            }
        }
    }

    private Bitmap getImage(String imageUrl)
    {   
        if(cache.getImageFromWarehouse(imageUrl) == null)
        {
            BitmapFactory.Options options = new BitmapFactory.Options();

            options.inJustDecodeBounds = true;

            options.inSampleSize = inSampleSize;

            try
            {
                URL url = new URL(imageUrl);

                HttpURLConnection connection = (HttpURLConnection)url.openConnection();

                InputStream stream = connection.getInputStream();

                image = BitmapFactory.decodeStream(stream, null, options);

                int imageWidth = options.outWidth;

                int imageHeight = options.outHeight;

                if(imageWidth > desiredWidth || imageHeight > desiredHeight)
                {   
                    System.out.println("imageWidth:"+imageWidth+", imageHeight:"+imageHeight);

                    inSampleSize = inSampleSize + 2;

                    getImage(imageUrl);
                }
                else
                {   
                    options.inJustDecodeBounds = false;

                    connection = (HttpURLConnection)url.openConnection();

                    stream = connection.getInputStream();

                    image = BitmapFactory.decodeStream(stream, null, options);

                    return image;
                }
            }

            catch(Exception e)
            {
                Log.e("getImage", e.toString());
            }
        }

        return image;
    }

পদক্ষেপ 3: আপনার Activityবা থেকে ব্যবহারAdapter

দ্রষ্টব্য: আপনি Activityক্লাস থেকে url থেকে চিত্র লোড করতে চান । এর দ্বিতীয় কনস্ট্রাক্টর ব্যবহার করুন DownloadImageTask, তবে আপনি যদি Adapterপ্রথম কনস্ট্রাক্টর ব্যবহার থেকে চিত্র প্রদর্শন করতে চান DownloadImageTask(উদাহরণস্বরূপ আপনার একটি চিত্র রয়েছে ListViewএবং আপনি 'অ্যাডাপ্টার' থেকে চিত্রটি সেট করছেন)

ক্রিয়াকলাপ থেকে ব্যবহার করুন:

ImageView imv = (ImageView) findViewById(R.id.imageView);
ImagesCache cache = ImagesCache.getInstance();//Singleton instance handled in ImagesCache class.
cache.initializeCache();

String img = "your_image_url_here";

Bitmap bm = cache.getImageFromWarehouse(img);

if(bm != null)
{
  imv.setImageBitmap(bm);
}
else
{
  imv.setImageBitmap(null);

  DownloadImageTask imgTask = new DownloadImageTask(cache, imv, 300, 300);//Since you are using it from `Activity` call second Constructor.

  imgTask.execute(img);
}

অ্যাডাপ্টারের কাছ থেকে ব্যবহার করুন:

ImageView imv = (ImageView) rowView.findViewById(R.id.imageView);
ImagesCache cache = ImagesCache.getInstance();
cache.initializeCache();

String img = "your_image_url_here";

Bitmap bm = cache.getImageFromWarehouse(img);

if(bm != null)
{
  imv.setImageBitmap(bm);
}
else
{
  imv.setImageBitmap(null);

  DownloadImageTask imgTask = new DownloadImageTask(this, 300, 300);//Since you are using it from `Adapter` call first Constructor.

  imgTask.execute(img);
}

বিঃদ্রঃ:

cache.initializeCache()আপনি আপনার অ্যাপ্লিকেশনটির প্রথম ক্রিয়াকলাপে এই বিবৃতিটি ব্যবহার করতে পারেন। একবার আপনি ক্যাশে শুরু করেছেন আপনি যদি ImagesCacheউদাহরণ ব্যবহার করেন তবে প্রতিবার এটি আরম্ভ করার দরকার নেই ।

আমি বিষয়গুলি ব্যাখ্যা করার ক্ষেত্রে কখনই ভাল নই তবে আশা করি এটি প্রাথমিকভাবে সাহায্য করবে যে কীভাবে ক্যাশে LruCacheএবং এর ব্যবহার ব্যবহার করতে হবে :)

সম্পাদনা করুন:

এখন একটি দিন সেখানে খুব বিখ্যাত নামে পরিচিত লাইব্রেরি হয় Picassoএবং Glideযা Android অ্যাপ্লিকেশন খুব দক্ষতার লোড ইমেজ ব্যবহার করা যাবে। অ্যান্ড্রয়েড এবং গ্লাইড ফর অ্যান্ড্রয়েডের জন্য এই খুব সহজ এবং দরকারী গ্রন্থাগার পিকাসো ব্যবহার করে দেখুন । আপনাকে ক্যাশে চিত্রগুলি নিয়ে চিন্তা করার দরকার নেই।

পিকাসো আপনার অ্যাপ্লিকেশনটিতে ঝামেলা-মুক্ত চিত্র লোড করার অনুমতি দেয় — প্রায়শই কোডের এক লাইনে!

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

গ্লাইড এবং পিকাসোর পার্থক্যের জন্য আপনি ব্লগটিও দেখতে পারেন


3
অসামান্য উত্তর এবং ব্যাখ্যা! আমি মনে করি এটি অফলাইনটি অফলাইনে থাকা এবং অ্যান্ড্রয়েড ল্রুচ্যাচ ব্যবহার করার পরে এটি সেরা সমাধান। আমি দেখতে পেয়েছি যে জোয়ের সংযোজনে এড্রোল্যান্ডের সমাধানটি বিমান মোডেও কাজ করে না, যা সংহত করার জন্য আরও বেশি প্রচেষ্টা প্রয়োজন। বিটিডব্লিউ, দেখে মনে হচ্ছে অ্যান্ড্রয়েড বা নেটওয়ার্ক আপনি অতিরিক্ত কিছু না করলেও উল্লেখযোগ্য পরিমাণে ক্যাচিং সরবরাহ করে। (একটি গৌণ নিট: নমুনা ব্যবহারের জন্য আইভ্যাশনফর্মওয়্যারহাউস থেকে, 'এইচ' মেলাতে ছোট হাতের অক্ষর হওয়া উচিত Thanks ধন্যবাদ!
এডউইন ইভান্স

1
দুর্দান্ত ব্যাখ্যা :)
XtreemDeveloper

আপনি getImage () পদ্ধতিটি ব্যাখ্যা করতে পারেন, বিশেষত এটি চিত্রের আকারে কী করে এবং কীভাবে তা ঘটে। আপনি কেন আবার নিজের ভিতরে ফাংশনটি কল করেন এবং এটি কীভাবে কাজ করে তা উদাহরণস্বরূপ বুঝতে পারি না।
গ্রেশ্যাক

1
if(cache == null)আমার সমস্যার সমাধান করে তার জন্য উজ্জীবিত ! :)
মি। গার্সিয়া

1
এছাড়াও আমার সম্পাদিত উত্তরটি শেষে দেখুন। আমি এখন বেশিরভাগ বিকাশকারীদের দ্বারা ব্যবহৃত বিখ্যাত গ্রন্থাগারগুলি সম্পর্কে উল্লেখ করেছি। সেই পিকাসো চেষ্টা করুন: স্কোয়ার.github.io/picasso এবং গ্লাইড: ভাউচারস্টড.আইও
জুবায়ের আহমেদ

18

একটি চিত্র ডাউনলোড করতে এবং মেমরি কার্ডে সংরক্ষণ করতে আপনি এটি এটি করতে পারেন।

//First create a new URL object 
URL url = new URL("http://www.google.co.uk/logos/holiday09_2.gif")

//Next create a file, the example below will save to the SDCARD using JPEG format
File file = new File("/sdcard/example.jpg");

//Next create a Bitmap object and download the image to bitmap
Bitmap bitmap = BitmapFactory.decodeStream(url.openStream());

//Finally compress the bitmap, saving to the file previously created
bitmap.compress(CompressFormat.JPEG, 100, new FileOutputStream(file));

আপনার ম্যানিফেস্টে ইন্টারনেট অনুমতি যুক্ত করতে ভুলবেন না:

<uses-permission android:name="android.permission.INTERNET" />

10
আপনি কেন জেপিজি ডিকোড করছেন এবং তারপরে এটিকে পুনরায় এনকোডিং করছেন? আপনি বাইট অ্যারেতে ইউআরএল ডাউনলোড করতে আরও ভাল পরিবেশন করেছেন, তারপরে আপনার বিটম্যাপটি তৈরি করতে এবং কোনও ফাইলে লেখার জন্য বাইট অ্যারেটি ব্যবহার করে। আপনি যখনই কোনও জেপিজি ডিকোড এবং পুনরায় এনকোড করবেন তখনই চিত্রের মান আরও খারাপ হয়।
CommonsWare

2
ফেয়ার পয়েন্ট, গতির জন্য আরও কিছু ছিল তারপর। যদিও, যদি বাইট অ্যারে হিসাবে সংরক্ষণ করা হয় এবং উত্স ফাইলটি জেপিইজি না হয় তবে ফাইলটি যেভাবেই রূপান্তর করার দরকার পড়েনি? এসডিকে রিটার্নস থেকে "ডিকোডবাইটআর্রে" "ডিকোডেড বিটম্যাপ, বা যদি চিত্রের ডেটা ডিকোড করা যায় না তবে নথী" সুতরাং এটি আমাকে ভাবতে বাধ্য করে যে চিত্রের ডেটাটি সর্বদা ডিকোডিং করে তাই এর জন্য কি আবার পুনরায় এনকোডিংয়ের দরকার পড়বে না?
Ljdawson

দক্ষতার কথা বলছি, যদি ফাইলআউটপুট স্ট্রিমের পরিবর্তে আমরা বাফারড আউটপুট স্ট্রিমটি পাস করি তবে কী দক্ষ হবে না?
সামুহ

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

এখনি 50 এমবি এর এমপিএল সীমা সহ, এসডি কার্ডে ক্যাশ করা বিকাশকারীদের পক্ষে একমাত্র উপায়।
লিজডসন

13

আমি droidfu এর চিত্র ক্যাশে ব্যবহার বিবেচনা করব। এটি মেমরি এবং ডিস্ক-ভিত্তিক চিত্র ক্যাশে উভয়ই প্রয়োগ করে। আপনি এমন একটি ওয়েবআইমেজভিও পান যা ইমেজক্যাস লাইব্রেরির সুবিধা নেয়।

এখানে ড্রয়েডফু এবং ওয়েবআইমেজভিউয়ের সম্পূর্ণ বিবরণ দেওয়া হয়েছে: http://brainflush.wordpress.com/2009/11/23/droid-fu-part-2-webimageview- এবং-webgalleryadapter/


২০১০ সাল থেকে তিনি তার কোডটি রিফ্যাক্ট করেছেন; মূল লিঙ্কটি এখানে: github.com/kaeppler/droid-fu
এসিলিভার

3
সেই লিঙ্কটি এখনও কাজ করে না। আমি অ্যান্ড্রয়েড- ইমেজম্যানেজার github.com/felipecsl/Android- ইমেজ ম্যানেজার
ফিলিপ লিমা

9

আমি সফ্টরিফারেন্স চেষ্টা করেছি, এন্ড্রয়েডে এরা খুব আক্রমণাত্মকভাবে পুনরায় দাবি করেছে যে আমি অনুভব করেছি যে সেগুলি ব্যবহার করার কোনও অর্থ নেই


2
সম্মত - সফটওয়্যারফারেন্সগুলি আমি পরীক্ষিত ডিভাইসগুলিতে খুব দ্রুত পুনরুদ্ধার করা হয়
এসিলিভার

3
গুগল নিজেরাই নিশ্চিত করেছে যে ডালভিকের জিসি SoftReferenceএস সংগ্রহ করতে খুব আগ্রাসী is তারা তাদের LruCacheপরিবর্তে ব্যবহার করার পরামর্শ দেয় ।
কাকা

9

থান্ডার খরগোশের পরামর্শ অনুসারে, কাজের জন্য ইমেজডাউনলোডার সেরা। আমি এখানে ক্লাসের কিছুটা ভিন্নতাও পেয়েছি:

http://theandroidcoder.com/utilities/android-image-download-and-caching/

উভয়ের মধ্যে প্রধান পার্থক্য হ'ল ইমেজডাউনলোডার অ্যান্ড্রয়েড ক্যাচিং সিস্টেমটি ব্যবহার করে এবং পরিবর্তিত ব্যক্তি অভ্যন্তরীণ এবং বাহ্যিক স্টোরেজ ক্যাশেড হিসাবে ব্যবহার করে, ক্যাশেড চিত্রগুলি অনির্দিষ্টকালের জন্য রেখে দেয় বা ব্যবহারকারী ম্যানুয়ালি অপসারণ না করে। লেখক অ্যান্ড্রয়েড ২.১ এর সামঞ্জস্যের কথাও উল্লেখ করেছেন।


7

এটি জো-র একটি ভাল ক্যাচ। উপরের কোড উদাহরণে দুটি সমস্যা রয়েছে - একটি - প্রতিক্রিয়া অবজেক্টটি বিটম্যাপের উদাহরণ নয় (যখন আমার ইউআরএল একটি জেপিজি রেফারেন্স করে, যেমন http: \ Website.com \ image.jpg এর একটি

org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl $ LimitedInputStream)।

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

http://codebycoffee.com/2010/06/29/using-responsecache-in-an-android-app/

ইউআরএল সংযোগ ক্যাচিং এপিআই এখানে বর্ণিত হয়েছে:

http://download.oracle.com/javase/6/docs/technotes/guides/net/http-cache.html

আমি এখনও মনে করি এটি এই রুটটিতে যাওয়ার একটি ঠিক সমাধান - তবে আপনাকে এখনও একটি ক্যাশে লিখতে হবে। মজার মত শোনাচ্ছে, তবে আমি বরং বৈশিষ্ট্যগুলি লিখি।


7

এ সম্পর্কে অ্যান্ড্রয়েডের অফিসিয়াল প্রশিক্ষণ বিভাগে একটি বিশেষ এন্ট্রি রয়েছে: http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

বিভাগটি বেশ নতুন, প্রশ্ন জিজ্ঞাসা করার সময় এটি ছিল না।

প্রস্তাবিত সমাধানটি হ'ল একটি লুচিচি ব্যবহার করা। এই ক্লাসটি হানিকম্বের সাথে চালু হয়েছিল, তবে এটি সামঞ্জস্য লাইব্রেরিতে অন্তর্ভুক্ত রয়েছে।

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

অফিসিয়াল পৃষ্ঠা থেকে নমুনা কোড:

private LruCache mMemoryCache;

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    // Get memory class of this device, exceeding this amount will throw an
    // OutOfMemory exception.
    final int memClass = ((ActivityManager) context.getSystemService(
            Context.ACTIVITY_SERVICE)).getMemoryClass();

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

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

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

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

পূর্বে সফ্টরাইফারেন্সগুলি একটি ভাল বিকল্প ছিল, তবে আর নয়, অফিসিয়াল পৃষ্ঠা থেকে উদ্ধৃত:

দ্রষ্টব্য: অতীতে, একটি জনপ্রিয় মেমরি ক্যাশে প্রয়োগকরণ ছিল একটি সফ্টরফারেন্স বা WeakReferences বিটম্যাপ ক্যাশে, তবে এটি প্রস্তাবিত নয়। অ্যান্ড্রয়েড ২.৩ (এপিআই স্তর 9) থেকে শুরু করে আবর্জনা সংগ্রহকারী নরম / দুর্বল রেফারেন্স সংগ্রহ করার সাথে আরও আক্রমণাত্মক যা তাদের মোটামুটি অকার্যকর করে তোলে। এছাড়াও, অ্যান্ড্রয়েড 3.0.০ (এপিআই লেভেল ১১) এর আগে, বিটম্যাপের ব্যাকিং ডেটা দেশীয় মেমরিতে সংরক্ষণ করা হয়েছিল যা অনুমানযোগ্য পদ্ধতিতে প্রকাশিত হয় না, সম্ভবত কোনও অ্যাপ্লিকেশনটি সংক্ষিপ্তভাবে তার স্মৃতি সীমা এবং ক্র্যাশ ছাড়িয়ে যায়।


3

ব্যবহার করার কথা বিবেচনা ইউনিভার্সাল ভাবমূর্তি লোডার গ্রন্থাগার দ্বারা সার্জি Tarasevich । এটি সঙ্গে আসে:

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

ইউনিভার্সাল ইমেজ লোডার নীচের ক্যাশে কনফিগারেশন সহ ডাউনলোড করা চিত্রগুলির জন্য বিশদ ক্যাশে পরিচালনার মঞ্জুরি দেয় :

  • UsingFreqLimitedMemoryCache: কমপক্ষে ঘন ঘন ক্যাশে আকার সীমা ছাড়িয়ে গেলে ব্যবহৃত বিটম্যাপটি মুছে ফেলা হয়।
  • LRULimitedMemoryCache: কমপক্ষে সম্প্রতি যখন ক্যাশের মাপ সীমা অতিক্রম হওয়ার সাথে সাথে ব্যবহার বিটম্যাপ মুছে ফেলা হয়।
  • FIFOLimitedMemoryCache: ক্যাশে আকার সীমা ছাড়িয়ে গেলে মুছে ফেলার জন্য ফিফোর নিয়ম ব্যবহার করা হয়।
  • LargestLimitedMemoryCache: বৃহত্তম ক্যাশে আকার সীমা ছাড়িয়ে গেলে বিটম্যাপটি মোছা হয়।
  • LimitedAgeMemoryCache: এর বয়স নির্ধারিত মানের থেকে বেশি হলে ক্যাশেড বস্তুটি মোছা হয়
  • WeakMemoryCache: বিটম্যাপের কেবল দুর্বল উল্লেখ সহ একটি মেমরি ক্যাশে।

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

ImageView imageView = groupView.findViewById(R.id.imageView);
String imageUrl = "http://site.com/image.png"; 

ImageLoader imageLoader = ImageLoader.getInstance();
imageLoader.init(ImageLoaderConfiguration.createDefault(context));
imageLoader.displayImage(imageUrl, imageView);

এই উদাহরণটি ডিফল্ট ব্যবহার করে UsingFreqLimitedMemoryCache


যখন নিবিড়ভাবে ব্যবহার করা হবে, ইউনিভার্সাল ইমেজ লোডার অনেকগুলি মেমরি ফাঁসের কারণ ঘটবে। আমি সন্দেহ করি এটি ঘটেছে কারণ এটি কোডে সিঙ্গলেটগুলি ব্যবহার করে (উদাহরণে 'getInstance ()' দেখুন)। প্রচুর চিত্র লোড করার পরে এবং কয়েকবার আমার স্ক্রিনটি ঘোরানোর পরে, আমার অ্যাপ্লিকেশনটি সর্বদা ক্র্যাশ হয়ে যায় কারণ ইউআইএল-এ আউটআম্মিরিঅরফরেন্সগুলি। এটি একটি দুর্দান্ত লাইব্রেরি তবে এটি আপনার কাছে একটি সত্যই সত্য যা আপনার উচিত হবে বিশেষত অ্যান্ড্রয়েডে নয়,
সিলেটলেট

1
আপনি কীভাবে জানেন যখন সিঙ্গেলন ব্যবহার করুন! :)
রিনিটিক

3

আসলে আমার পক্ষে যা কাজ করেছিল তা ছিল আমার প্রধান শ্রেণিতে রেসপন্স ক্যাশে সেট করা:

try {
   File httpCacheDir = new File(getApplicationContext().getCacheDir(), "http");
   long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
   HttpResponseCache.install(httpCacheDir, httpCacheSize);
} catch (IOException e) { } 

এবং

connection.setUseCaches(true);

বিটম্যাপ ডাউনলোড করার সময়।

http://practicaldroid.blogspot.com/2013/01/utilizing-http-response-cache.html


এটা সম্ভব httpresponsecache সঙ্গে conjuction মধ্যে lrucache ব্যবহার করতে
iOSAndroidWindowsMobileAppsDev

2

অ্যান্ড্রয়েডের জন্য গুগলের লিবস ইমেজ এবং ফাইল ক্যাশে পরিচালনা করার জন্য একটি দুর্দান্ত লাইব্রেরি রয়েছে।

http://code.google.com/p/libs-for-android/


1
অবচয় । এখন বিটম্যাপফুন দেখুন।
greg7gkb

1

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

তবে ইমেজডাউনলোডার জাভা আমার জন্য আশ্চর্যজনকভাবে কাজ করে। সক্ষমতা না পৌঁছানো বা শুদ্ধ সময় শেষ হওয়ার আগ পর্যন্ত এটি হ্যাশম্যাপ ব্যবহার করে, তারপরে জিনিসগুলি একটি সফ্টরফেরেন্সিতে স্থানান্তরিত হয়, যার ফলে উভয় বিশ্বের সেরা ব্যবহার করে।



0

এমনকি পরে উত্তর, কিন্তু আমি একটি অ্যান্ড্রয়েড ইমেজ ম্যানেজার লিখেছি যা স্বচ্ছভাবে ক্যাশে পরিচালনা করে (মেমরি এবং ডিস্ক)। কোডটি গিথুব https://github.com/felipecsl/Android- আইমেজ ম্যানেজারে রয়েছে


1
আমি এটি একটি তালিকাভিউতে যুক্ত করেছি এবং এটি খুব ভালভাবে পরিচালনা করবে বলে মনে হয় না। তালিকাভিউগুলির জন্য কি কোনও বিশেষ বাস্তবায়ন রয়েছে?

0

দেরিতে উত্তর, তবে আমি বুঝতে পেরেছিলাম যে আমার সাইটে আমার একটি লিঙ্ক যুক্ত করা উচিত কারণ আমি কীভাবে অ্যান্ড্রয়েডের জন্য একটি চিত্র ক্যাশে তৈরি করতে পারি তার একটি টিউটোরিয়াল লিখেছি: http://squarewolf.nl/2010/11/android-image-cache/ আপডেট: দ্য উত্সটি পুরানো হওয়ায় পৃষ্ঠাটি অফলাইনে নেওয়া হয়েছে। আমি ইগনিশন ব্যবহারের পরামর্শে @elenasys এ যোগদান করি ।

সুতরাং এই সমস্ত লোকদের যারা এই প্রশ্নে হোঁচট খাচ্ছে এবং এর সমাধান খুঁজে পেলেন না: আশা করি আপনি উপভোগ করবেন! = D:


0

দেরীতে উত্তর তবে আমি মনে করি এই লাইব্রেরিটি ক্যাচিং চিত্রগুলিতে অনেক সহায়তা করবে: https://github.com/crypticminds/ColdStorage

@LoadCache (R.id.id_of_my_image_view, "URL_to_downlaod_image_from) দিয়ে ইমেজভিউটিকে সহজেই বর্ননা করুন এবং এটি চিত্রটি ডাউনলোড এবং এটি চিত্রের দৃশ্যে লোড করার যত্ন নেবে। আপনি একটি স্থানধারক চিত্র এবং লোড অ্যানিমেশনটিও নির্দিষ্ট করতে পারেন।

টীকাটির বিশদ ডকুমেন্টেশন এখানে উপস্থিত রয়েছে: - https://github.com/crypticminds/ColdStorage/wiki/@LoadImage-annotation

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.