পিকাসোতে আমি কীভাবে ডিস্ক ক্যাশে ব্যবহার করব?


119

আমি আমার অ্যান্ড্রয়েড অ্যাপে চিত্র প্রদর্শন করতে পিকাসো ব্যবহার করছি:

/**
* load image.This is within a activity so this context is activity
*/
public void loadImage (){
    Picasso picasso = Picasso.with(this); 
    picasso.setDebugging(true);
    picasso.load(quiz.getImageUrl()).into(quizImage);
}

আমি ডিবাগিং সক্ষম করেছি এবং এটি সর্বদা লাল এবং সবুজ দেখায় ut তবে কখনও কখনও হলুদ দেখায় না

এখন আমি যদি পরের বার একই চিত্র লোড করি এবং ইন্টারনেট উপলব্ধ না হয় তবে চিত্রটি লোড হয় না।

প্রশ্নাবলী:

  1. এটিতে কি স্থানীয় ডিস্ক ক্যাশে নেই?
  2. আমি কীভাবে ডিস্ক ক্যাশে সক্ষম করব কারণ আমি একই চিত্রটি একাধিকবার ব্যবহার করব।
  3. অ্যান্ড্রয়েড ম্যানিফেস্ট ফাইলটিতে আমার কি কিছু ডিস্ক অনুমতি যুক্ত করার দরকার আছে?

আমার একই সমস্যা হচ্ছে এটা ক্যাশে হবে না!
জোনাথন

বন্ধুরা, আপনার ফেসবুকের ফ্রেস্কো লাইবটি একবার দেখা উচিত। এটির ক্যাশে পরিচালনা দুর্দান্ত।
মিশেল ফরেস 3

উত্তর:


229

এটাই আমি করেছি। ভাল কাজ করে.

প্রথমে অ্যাপ্লিকেশন মডিউলের গ্রেড বিল্ড ফাইলে OkHttp যুক্ত করুন:

compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.squareup.okhttp3:okhttp:3.10.0'
compile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.1.0'

তারপরে একটি বর্ধিত শ্রেণি তৈরি করুন Application

import android.app.Application;

import com.jakewharton.picasso.OkHttp3Downloader;
import com.squareup.picasso.Picasso;

public class Global extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        Picasso.Builder builder = new Picasso.Builder(this);
        builder.downloader(new OkHttp3Downloader(this,Integer.MAX_VALUE));
        Picasso built = builder.build();
        built.setIndicatorsEnabled(true);
        built.setLoggingEnabled(true);
        Picasso.setSingletonInstance(built);

    }
}

এটি ম্যানিফেস্ট ফাইলটিতে নিম্নলিখিত হিসাবে যুক্ত করুন:

<application
        android:name=".Global"
        .. >

</application>

এখন পিকাসোটি আপনার মতো করে ব্যবহার করুন। পরিবর্তন নেই.

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

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

Picasso.with(this)
            .load(url)
            .networkPolicy(NetworkPolicy.OFFLINE)
            .into(imageView);

সম্পাদনা # 2

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

Picasso.with(getActivity())
.load(imageUrl)
.networkPolicy(NetworkPolicy.OFFLINE)
.into(imageView, new Callback() {
    @Override
    public void onSuccess() {

    }

    @Override
    public void onError() {
        //Try again online if cache failed
        Picasso.with(getActivity())
                .load(posts.get(position).getImageUrl())
                .error(R.drawable.header)
                .into(imageView, new Callback() {
            @Override
            public void onSuccess() {

            }

            @Override
            public void onError() {
                Log.v("Picasso","Could not fetch image");
            }
        });
    }
});

@ArtjomB। , আমি প্রশ্নের উত্তর দিয়েছি। এবং সমাধান কাজ করে। তবে এই সামান্য ব্যাখ্যাটি আমি ব্যবহার করতে পারি। আমি OkHttp ডকুমেন্টেশনের মধ্য দিয়ে গিয়েছিলাম এবং তারা "ক্যাশে" ইউনিটের কথা উল্লেখ করে না। তাই যদি কেউ কিছু জ্ঞান ভাগ করে নিতে চান ... এটি একটি ভাল সুযোগ।
সংকেত বার্দে

@ArtjomB। হ্যাঁ তা বোধগম্য হয়। সম্পাদিত!
সংকেত বার্ডে

5
@ সংকেতবার্ড: দ্রুত নোটের জন্য ধন্যবাদ তবে আমি বুঝতে পেরেছিলাম যে অ্যাপ্লিকেশনটি ব্যাকগ্রাউন্ডে চলছে (অফলাইনে থাকা অবস্থায়) তখনই চিত্রটি স্মৃতি থেকে উঠে আসবে। যদি আমি অ্যাপটি বন্ধ করি তবে এটি চলমান অ্যাপ্লিকেশনগুলি পরিষ্কার করে দেয় তবে আমার অ্যাপটি আবার খুলুন চিত্রগুলি ক্যাশে থেকে লোড হয় না। আমি ত্রুটিটি ডিফল্ট লোডিং ইমেজটি সেট করে রেখেছি। এখানে কী ভুল হতে পারে?
TheDevMan

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

1
সঙ্গে okhttp3.OkHttpClientআপনার লাইব্রেরি ব্যবহার করতে হবে OkHttp3Downloaderবর্গ ফর্ম compile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.1.0'
চাক

46

1) প্রথম প্রশ্নের উত্তর: উইথ () পদ্ধতির জন্য পিকাসো ডক অনুসারে

() দিয়ে ফিরে আসা গ্লোবাল ডিফল্ট পিকাসো দৃষ্টান্তটি স্বয়ংক্রিয়ভাবে ডিফল্টগুলি দিয়ে শুরু করা হয় যা বেশিরভাগ প্রয়োগের জন্য উপযুক্ত।

  • LRU মেমরির ক্যাশে 15% উপলব্ধ অ্যাপ্লিকেশন র‍্যাম
  • 50MB অবধি 2% স্টোরেজ স্পেসের ডিস্ক ক্যাশে কিন্তু 5MB এর চেয়ে কম নয়।

তবে Disk Cache গ্লোবাল ডিফল্ট পিকাসোর অপারেশন কেবলমাত্র API 14+ এ উপলব্ধ

2) দ্বিতীয় প্রশ্নের উত্তর: Picassoব্যবহার HTTPক্লায়েন্ট অনুরোধ Disk Cacheঅপারেশন তাই আপনি আপনার নিজের করতে পারেন http request headerসম্পত্তি হয়েছে Cache-Controlসঙ্গে max-age আর ব্যবহারের পিকাসো ডিফল্ট পরিবর্তে আপনার নিজের স্ট্যাটিক পিকাসো দৃষ্টান্ত তৈরি

1] HttpResponseCache (দ্রষ্টব্য: শুধুমাত্র API 13+ এর জন্য কাজ করে)
2] OkHttpClient (সমস্ত API এর জন্য কাজ করে)

OkHttpClientআপনার নিজস্ব স্ট্যাটিক পিকাসো ক্লাস তৈরি করতে ব্যবহারের উদাহরণ :

  • নিজের নিজস্ব সিঙ্গলটন picassoঅবজেক্টটি পেতে প্রথমে একটি নতুন বর্গ তৈরি করুন

    import android.content.Context;
    import com.squareup.picasso.Downloader;
    import com.squareup.picasso.OkHttpDownloader;
    import com.squareup.picasso.Picasso;
    
    public class PicassoCache {
    
        /**
         * Static Picasso Instance
         */
        private static Picasso picassoInstance = null;
    
        /**
         * PicassoCache Constructor
         *
         * @param context application Context
         */
        private PicassoCache (Context context) {
    
            Downloader downloader   = new OkHttpDownloader(context, Integer.MAX_VALUE);
            Picasso.Builder builder = new Picasso.Builder(context);
                builder.downloader(downloader);
    
            picassoInstance = builder.build();
        }
    
        /**
         * Get Singleton Picasso Instance
         *
         * @param context application Context
         * @return Picasso instance
         */
        public static Picasso getPicassoInstance (Context context) {
    
            if (picassoInstance == null) {
    
                new PicassoCache(context);
                return picassoInstance;
            }
    
            return picassoInstance;
        }
    
    } 
  • picassoপরিবর্তে আপনার নিজস্ব সিঙ্গলটন অবজেক্টটি ব্যবহার করুনPicasso.With()

PicassoCache.getPicassoInstance(getContext()).load(imagePath).into(imageView)

3) তৃতীয় প্রশ্নের উত্তর: আপনার ডিস্ক ক্যাশে ক্রিয়াকলাপের জন্য কোনও ডিস্ক অনুমতি দরকার নেই

তথ্যসূত্র : ডিস্ক ক্যাশে সম্পর্কে গিথুব ইস্যু , @ জেক-ওয়ার্টন -> প্রশ্ন 1 এবং প্রশ্ন 2 দ্বারা দুটি প্রশ্নের উত্তর দেওয়া হয়েছে


4
না, অ্যাপটি বন্ধ থাকলে এটি কাজ করে না। অ্যাপ বন্ধ করার পরে সমস্ত চিত্র অদৃশ্য হয়ে গেল।
nbumakov

2
এটি আমাকে এই ত্রুটিটি দিচ্ছে:FATAL EXCEPTION: main java.lang.NoClassDefFoundError: com.squareup.okhttp.OkHttpClient
সার্কেল

@ সিরকাল দেরীতে দুঃখিত, উদাহরণ ব্যবহার করার জন্য আপনাকে প্রথমে ডাউনলোড করতে হবে [okhttp] ( স্কয়ার.github.io/okhttp ) প্যাকেজ এবং [ওকিও] ( github.com/square/okio ) প্যাকেজ যাokhttp
আহমেদ

@CIRCLE হতে পারে আপনি ডাউনলোড [okhttp-urlconnection] (প্রয়োজন mvnrepository.com/artifact/com.squareup.okhttp/... ) প্যাকেজ খুব
আহমেদ হামদি

এটি আমার জন্য কাজ করছে না। চিত্র তাদের অবস্থান viewPager প্রতিটি সময় পুনরায় লোড করা হচ্ছে যখন আমি স্ক্রল
চারু

21

ক্যাশিংয়ের জন্য, আমি ক্যাশে নীতি নিয়ন্ত্রণ করতে OkHttp ইন্টারসেপ্টর ব্যবহার করব । OkHttp লাইব্রেরিতে অন্তর্ভুক্ত এই নমুনাটি দেখুন।

RewriteResponseCacheControl.java

এখানে আমি পিকাসোর সাথে কীভাবে এটি ব্যবহার করব -

OkHttpClient okHttpClient = new OkHttpClient();
    okHttpClient.networkInterceptors().add(new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Response originalResponse = chain.proceed(chain.request());
            return originalResponse.newBuilder().header("Cache-Control", "max-age=" + (60 * 60 * 24 * 365)).build();
        }
    });

    okHttpClient.setCache(new Cache(mainActivity.getCacheDir(), Integer.MAX_VALUE));
    OkHttpDownloader okHttpDownloader = new OkHttpDownloader(okHttpClient);
    Picasso picasso = new Picasso.Builder(mainActivity).downloader(okHttpDownloader).build();
    picasso.load(imageURL).into(viewHolder.image);

1
আর কাজ করে না
নভে

1
OkHttp 3.x- এ @noev আপনি ইন্টারসেপ্টর যুক্ত করতে বিল্ডার প্যাটার্ন ( github.com/square/okhttp/wiki/Interceptors দেখুন ) ব্যবহার করতে পারেন ।
গৌরব বি

10

সর্বাধিক আপডেট করা সংস্করণ 2.71828 এর জন্য এটি আপনার উত্তর।

প্রশ্ন 1 : এটিতে স্থানীয় ডিস্ক ক্যাশে নেই?

এ 1 : পিকাসোর মধ্যে ডিফল্ট ক্যাশে রয়েছে এবং অনুরোধটি ঠিক এর মতো প্রবাহিত হয়েছে

App -> Memory -> Disk -> Server

তারা যেখানে প্রথমে তাদের চিত্রের সাথে দেখা করেছে, তারা সেই চিত্রটি ব্যবহার করবে এবং তারপরে অনুরোধ প্রবাহকে থামিয়ে দেবে। প্রতিক্রিয়া প্রবাহ সম্পর্কে কি? চিন্তা করবেন না, এটি এখানে।

Server -> Disk -> Memory -> App

ডিফল্টরূপে, তারা বর্ধিত রাখার ক্যাশে প্রথমে একটি স্থানীয় ডিস্কে সঞ্চয় করবে। তারপরে মেমরিটি, উদাহরণস্বরূপ ক্যাশে ব্যবহারের জন্য।

এটি সক্ষম করে ছবিগুলি কোথায় তৈরি হয় তা দেখতে আপনি পিকাসোর অন্তর্নির্মিত সূচকটি ব্যবহার করতে পারেন।

Picasso.get().setIndicatorEnabled(true);

এটি আপনার ছবিগুলির উপরের বাম কোণে একটি পতাকা প্রদর্শন করবে।

  • লাল পতাকা মানে ছবিগুলি সার্ভার থেকে আসে। (প্রথম লোডে কোনও ক্যাশে নেই)
  • নীল পতাকা মানে ছবিগুলি স্থানীয় ডিস্ক থেকে আসে। (ক্যাশিং)
  • সবুজ পতাকা মানে চিত্রগুলি মেমরি থেকে আসে। (ইনস্ট্যান্স ক্যাচিং)

প্রশ্ন 2 : আমি একই চিত্রটি একাধিকবার ব্যবহার করব বলে আমি কীভাবে ডিস্ক ক্যাচিং সক্ষম করব?

এ 2 : আপনার এটি সক্ষম করতে হবে না। এটি ডিফল্ট।

আপনি যখন যা করতে চান আপনার চিত্রগুলি সর্বদা সতেজ থাকে তা আপনার অক্ষম করা উচিত। অক্ষম ক্যাশিংয়ের 2-উপায় রয়েছে।

  1. সেট .memoryPolicy()থেকে NO_CACHE এবং / অথবা NO_STORE এবং প্রবাহ এমন দেখাবে।

NO_CACHE মেমরি থেকে চিত্রগুলি সন্ধান করা এড়িয়ে যাবে।

App -> Disk -> Server

NO_STORE মেমরির যখন প্রথম লোড চিত্র দোকান ইমেজ এড়িয়ে যাবে।

Server -> Disk -> App
  1. সেট .networkPolicy()থেকে NO_CACHE এবং / অথবা NO_STORE এবং প্রবাহ এমন দেখাবে।

NO_CACHE ডিস্ক থেকে চিত্রগুলি অনুসন্ধান করা এড়িয়ে যাবে।

App -> Memory -> Server

কোনও প্রথম চিত্র যখন লোড হবে তখন কোনও ডিস্কে স্টোর চিত্রগুলি এড়িয়ে যাবে।

Server -> Memory -> App

সম্পূর্ণরূপে কোনও ক্যাশিং চিত্রের জন্য আপনি অক্ষম করতে পারেন । এখানে একটি উদাহরণ।

Picasso.get().load(imageUrl)
             .memoryPolicy(MemoryPolicy.NO_CACHE,MemoryPolicy.NO_STORE)
             .networkPolicy(NetworkPolicy.NO_CACHE, NetworkPolicy.NO_STORE)
             .fit().into(banner);

সম্পূর্ণরূপে কোনও ক্যাশিং এবং কোনও স্টোরিংয়ের প্রবাহ এ রকম দেখাবে না।

App -> Server //Request

Server -> App //Response

সুতরাং, আপনার অ্যাপ স্টোরেজ ব্যবহারটিও ছোট করতে আপনার প্রয়োজন হতে পারে।

Q3 : অ্যান্ড্রয়েড ম্যানিফেস্ট ফাইলটিতে আমার কিছু ডিস্ক অনুমতি যুক্ত করার দরকার আছে?

এ 3 : না, তবে আপনার এইচটিটিপি অনুরোধের জন্য ইন্টারনেট অনুমতি যুক্ত করতে ভুলবেন না।


6

1) পিকাসোর ডিফল্টরূপে ক্যাশে থাকে (আহাম্মেদ হামির উত্তর দেখুন)

2) আপনার যদি অবশ্যই ডিস্ক ক্যাশে এবং তারপরে নেটওয়ার্কটি থেকে ছবিটি নিতে হয় আমি আপনার নিজের ডাউনলোডার লেখার পরামর্শ দিই:

public class OkHttpDownloaderDiskCacheFirst extends OkHttpDownloader {
    public OkHttpDownloaderDiskCacheFirst(OkHttpClient client) {
        super(client);
    }

    @Override
    public Response load(Uri uri, int networkPolicy) throws IOException {
        Response responseDiskCache = null;
        try {
            responseDiskCache = super.load(uri, 1 << 2); //NetworkPolicy.OFFLINE
        } catch (Exception ignored){} // ignore, handle null later

        if (responseDiskCache == null || responseDiskCache.getContentLength()<=0){
            return  super.load(uri, networkPolicy); //user normal policy
        } else {
            return responseDiskCache;
        }

    }
}

এবং অ্যাপ্লিকেশন সিঙ্গলটনে পদ্ধতিতে অনক্রিয়েট এটি পিকাসোর সাথে ব্যবহার করুন:

        OkHttpClient okHttpClient = new OkHttpClient();

        okHttpClient.setCache(new Cache(getCacheDir(), 100 * 1024 * 1024)); //100 MB cache, use Integer.MAX_VALUE if it is too low
        OkHttpDownloader downloader = new OkHttpDownloaderDiskCacheFirst(okHttpClient); 

        Picasso.Builder builder = new Picasso.Builder(this);

        builder.downloader(downloader);

        Picasso built = builder.build();

        Picasso.setSingletonInstance(built);

3) ডিফল্ট অ্যাপ্লিকেশন ক্যাশে ফোল্ডারের জন্য কোনও অনুমতি প্রয়োজন


1

Application.onCreateএরপরে ফলঅনিং কোড যুক্ত করুন এটি সাধারণভাবে ব্যবহার করুন

    Picasso picasso = new Picasso.Builder(context)
            .downloader(new OkHttp3Downloader(this,Integer.MAX_VALUE))
            .build();
    picasso.setIndicatorsEnabled(true);
    picasso.setLoggingEnabled(true);
    Picasso.setSingletonInstance(picasso);

আপনি যদি প্রথমে চিত্রগুলি ক্যাশে করেন তবে এর মতো কিছু করুন ProductImageDownloader.doBackground

final Callback callback = new Callback() {
            @Override
            public void onSuccess() {
                downLatch.countDown();
                updateProgress();
            }

            @Override
            public void onError() {
                errorCount++;
                downLatch.countDown();
                updateProgress();
            }
        };
        Picasso.with(context).load(Constants.imagesUrl+productModel.getGalleryImage())
                .memoryPolicy(MemoryPolicy.NO_CACHE).fetch(callback);
        Picasso.with(context).load(Constants.imagesUrl+productModel.getLeftImage())
                .memoryPolicy(MemoryPolicy.NO_CACHE).fetch(callback);
        Picasso.with(context).load(Constants.imagesUrl+productModel.getRightImage())
                .memoryPolicy(MemoryPolicy.NO_CACHE).fetch(callback);

        try {
            downLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        if(errorCount == 0){
            products.remove(productModel);
            productModel.isDownloaded = true;
            productsDatasource.updateElseInsert(productModel);
        }else {
            //error occurred while downloading images for this product
            //ignore error for now
            // FIXME: 9/27/2017 handle error
            products.remove(productModel);

        }
        errorCount = 0;
        downLatch = new CountDownLatch(3);

        if(!products.isEmpty() /*&& testCount++ < 30*/){
            startDownloading(products.get(0));
        }else {
            //all products with images are downloaded
            publishProgress(100);
        }

এবং আপনার ছবিগুলি স্বাভাবিকের মতো বা ডিস্ক ক্যাশে সহ লোড করুন

    Picasso.with(this).load(Constants.imagesUrl+batterProduct.getGalleryImage())
        .networkPolicy(NetworkPolicy.OFFLINE)
        .placeholder(R.drawable.GalleryDefaultImage)
        .error(R.drawable.GalleryDefaultImage)
        .into(viewGallery);

বিঃদ্রঃ:

লাল রঙ ইঙ্গিত দেয় যে চিত্রটি নেটওয়ার্ক থেকে আনা হয়েছে

সবুজ রঙ ইঙ্গিত দেয় যে চিত্রটি ক্যাশে মেমরি থেকে আনা হয়েছে ।

নীল রঙ নির্দেশ করে যে চিত্রটি ডিস্ক মেমরি থেকে আনা হয়েছে ।

অ্যাপ্লিকেশন প্রকাশের আগে মুছুন বা সেট করুন false picasso.setLoggingEnabled(true);, picasso.setIndicatorsEnabled(true);প্রয়োজন না হলে। বড়ই সৌন্দর্য্য


1

আমি জানি না কিভাবে ভাল সমাধান যে কিন্তু এটা স্পষ্টভাবে হয় সহজ আমি শুধু আমার app এর মধ্যে ব্যবহার করা হয় এবং এটা সূক্ষ্ম কাজ করা হয়

আপনি ছবিটি এমনভাবে লোড করুন

public void loadImage (){
Picasso picasso = Picasso.with(this); 
picasso.setDebugging(true);
picasso.load(quiz.getImageUrl()).into(quizImage);
}

আপনি পেতে পারেন bimapযে মত

Bitmap bitmap = Piccaso.with(this).load(quiz.getImageUrl()).get();

এখন গোপন যে Bitmapএকটি মধ্যে JPGফাইল এবং ক্যাশের মধ্যে সঞ্চয়, নীচের bimap পেয়ে এবং এটি ক্যাশে জন্য সম্পূর্ণ কোড

 Thread thread = new Thread() {
                            public void run() {
                                File file = new File(getActivity().getExternalCacheDir().getAbsolutePath() + "/" +member.getMemberId() + ".jpg");

                                try {
                                    Bitmap bitmap = Picasso.with(getActivity())
                                            .load(uri).get();
                                    bitmap.compress(Bitmap.CompressFormat.JPEG, 100,new FileOutputStream(file));

                                } catch (Exception e) {
                                   e.printStackTrace();
                                }
                            }
                        };
                        thread.start();
                    })

get()পদ্ধতি Piccassoজন্য কিছু কারণে প্রয়োজন পৃথক থ্রেডে বলা হবে, আমি যে একই থ্রেডে যে চিত্র সংরক্ষণ করছি।

ছবিটি সেভ হয়ে গেলে আপনি সমস্ত ফাইল পেতে পারেন

List<File> files = new LinkedList<>(Arrays.asList(context.getExternalCacheDir().listFiles()));

নীচের মত আপনি যে ফাইলটি সন্ধান করছেন তা এখন খুঁজে পেতে পারেন

for(File file : files){
                if(file.getName().equals("fileyouarelookingfor" + ".jpg")){ // you need the name of the file, for example you are storing user image and the his image name is same as his id , you can call getId() on user to get the file name
                    Picasso.with(getActivity()) // if file found then load it
                            .load(file)
                            .into(mThumbnailImage);
                    return; // return 
                }
        // fetch it over the internet here because the file is not found
       }

0

আমি এই কোডটি ব্যবহার করেছি এবং কাজ করেছি, সম্ভবত আপনার পক্ষে দরকারী:

public static void makeImageRequest(final View parentView,final int id, final String imageUrl) {

    final int defaultImageResId = R.mipmap.user;
    final ImageView imageView = (ImageView) parentView.findViewById(id);
    Picasso.with(context)
            .load(imageUrl)
            .networkPolicy(NetworkPolicy.OFFLINE)
            .into(imageView, new Callback() {
                @Override
                public void onSuccess() {
                Log.v("Picasso","fetch image success in first time.");
                }

                @Override
                public void onError() {
                    //Try again online if cache failed
                    Log.v("Picasso","Could not fetch image in first time...");
                    Picasso.with(context).load(imageUrl).networkPolicy(NetworkPolicy.NO_CACHE)
                            .memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE).error(defaultImageResId)
                            .into(imageView, new Callback() {

                                @Override
                                public void onSuccess() {
                                    Log.v("Picasso","fetch image success in try again.");
                                }

                                @Override
                                public void onError() {
                                  Log.v("Picasso","Could not fetch image again...");
                                }

                            });
                }
            });

}

-3

আমার একই সমস্যা ছিল এবং এর পরিবর্তে গ্লাইড লাইব্রেরি ব্যবহার করেছি। সেখানে বাক্সের বাইরে ক্যাশে রয়েছে। https://github.com/bumptech/glide


গ্লাইড পিকাসোর চেয়ে 5x বেশি কোড। ইতিমধ্যে ওখট্টপ ব্যবহার করার সময়, পিকাসো ব্যবহার করা আরও ভাল
আলেকজান্ডার ফারবার

2
উভয় লাইব্রেরি ক্যাচিং ব্যবহার করে তবে ক্যাশে পৃথকভাবে ব্যবহার করে: मध्यम.com
@
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.