বিটম্যাপের সাথে কলব্যাক পেতে পিকাসো ব্যবহার করুন


83

আমি আমার অ্যাপ্লিকেশনের জন্য চিত্রগুলি ডাউনলোড করতে পিকাসো ব্যবহার করছি ।

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

কীভাবে কেউ আমাকে দেখাতে পারেন?


উত্তর:


173

কেউ যদি ভাবছেন যে ক্ষেত্রে গিথুব এ উত্তরটি পেয়েছেন:

private Target target = new Target() {
      @Override
      public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
      }

      @Override
      public void onBitmapFailed(Drawable errorDrawable) {
      }

      @Override
      public void onPrepareLoad(Drawable placeHolderDrawable) {
      }
}

private void someMethod() {
   Picasso.with(this).load("url").into(target);
}

@Override 
public void onDestroy() {  // could be in onPause or onStop
   Picasso.with(this).cancelRequest(target);
   super.onDestroy();
}

পোস্টটি বেনামে কলব্যাক ব্যবহার না করে এবং পরিবর্তে লক্ষ্যের জন্য একটি উদাহরণ ভেরিয়েবল ব্যবহার করার পরামর্শ দেয়।


30
আদর্শভাবে আপনি কোনও Targetভিউতে বাস্তবায়ন করতেন বা সরাসরি ধারককে দেখবেন। আপনি যদি এটি না করে থাকেন তবে আপনার কোথাও নজিরটির দৃ a় রেফারেন্স বজায় রাখা দরকার অন্যথায় এটি আবর্জনা সংগ্রহ করবে।
জ্যাক ওয়ার্টন

@JakeWharton: যদি আমি একটি প্রতিটি আইটেমের উপর একটি কাস্টম অ্যানিমেশন প্রয়োগ করতে চান ListView, আপনি ভালো কিছু করতে হবে সেটির পরামর্শ: private static ViewHolder { private ImageView imageView; private Target target = new Target() { public void onBitmapLoaded() { // do animation on imageView } } }?
এমবিএমসি

@ জ্যাকওয়ার্টন সর্বশেষ মন্তব্যে এটি github.com/square/picasso/issues/308 এখানে ব্যাখ্যা করেছেন ।
toobsco42

8
onParepareLoad এর পরে বিটম্যাপলয়েড প্রথমবার কল করল না
অমিত থাপার

উদাহরণের জন্য ধন্যবাদ। আমি অনডেট্রয়েতে কেবল একটি সুপার কল মিস করছি।
বেন

71

এখান থেকে নেওয়া :

Picasso.with(this)
    .load(url)
    .into(new Target() {
        @Override
        public void onBitmapLoaded (final Bitmap bitmap, Picasso.LoadedFrom from){
            /* Save the bitmap or do something with it here */

            //Set it in the ImageView
            theView.setImageBitmap(bitmap); 
        }
});

আপডেট (মে 04, 2016):

            Picasso.with(this)
                .load(youUrl)
                .into(new Target() {
                    @Override
                    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {

                    }

                    @Override
                    public void onBitmapFailed(Drawable errorDrawable) {

                    }

                    @Override
                    public void onPrepareLoad(Drawable placeHolderDrawable) {

                    }
                });

আপডেট হয়েছে (নভেম্বর 22, 2016)

বা একটি শক্তিশালী রেফারেন্স ব্যবহার করে Targetযাতে এটি আবর্জনা সংগ্রহ না হয়

Target target = new Target() {
            @Override
            public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {

            }

            @Override
            public void onBitmapFailed(Drawable errorDrawable) {

            }

            @Override
            public void onPrepareLoad(Drawable placeHolderDrawable) {

            }
        };


void foo() {
        Picasso.with(getContext()).load(getUrl()).into(target);
}

কোটলিন

object: com.squareup.picasso.Target {
                  override fun onBitmapFailed(e: java.lang.Exception?, errorDrawable: Drawable?) {
                    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
                }

                  override fun onPrepareLoad(placeHolderDrawable: Drawable?) {
                    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
                  }

                  override fun onBitmapLoaded(bitmap: Bitmap?, from: Picasso.LoadedFrom?) {

                  }
                }

6
বেনাম লক্ষ্যবস্তু আবর্জনা সংগ্রহ করা হতে পারে
স্টিভ এম

@ স্টিভএম এবং এটি কী করবে? অনুরোধ বাতিল করবেন? বিটম্যাপটি লোড হতে আটকাবেন?
নুরেটিন

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

সুতরাং এই সমাধানটি সত্যিই খারাপ কারণ জিসি মাঝে মধ্যে কলব্যাকের লোডিং এবং কলিংয়ের মধ্যে দৌড়াতে পারে এবং কলব্যাক কল না করার কারণ হতে পারে।
স্টিভ এম

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

7

পরবর্তী কি সহজ হতে পারে:

val url: String = "https://...."
val bitmap: Bitmap = Picasso.with(context).load(url).get()

মূল থ্রেড থেকে নয়!

বা আরএক্সজাভা 2 এর সাথে:

fun getBitmapSingle(picasso: Picasso, url: String): Single<Bitmap> = Single.create {
    try {
        if (!it.isDisposed) {
            val bitmap: Bitmap = picasso.load(url).get()
            it.onSuccess(bitmap)
        }
    } catch (e: Throwable) {
        it.onError(e)
    }
}

বিটম্যাপ পুনরুদ্ধার করুন:

getBitmapSingle(Picasso.with(context), "https:/...")
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({ bitmap ->
                // val drawable = BitmapDrawable(context, bitmap)
                }, Throwable::printStackTrace)

আমি পিকাসো v.2.5.2 ব্যবহার করেছি


2

আমি ভেবেছিলাম সম্ভবত আপনারা কেউ কেউ উপরের উত্তরটির একটি আরএক্স জাভা সংস্করণ চান ... এটি এখানে:

    public static Observable<Bitmap> loadBitmap(Picasso picasso, String imageUrl) {
    return Observable.create(new Observable.OnSubscribe<Bitmap>() {
        @Override
        public void call(Subscriber<? super Bitmap> subscriber) {
            Target target = new Target() {
                @Override
                public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                    subscriber.onNext(bitmap);
                    subscriber.onCompleted();
                }

                @Override
                public void onBitmapFailed(Drawable errorDrawable) {
                    subscriber.onError(new Exception("failed to load " + imageUrl));
                }

                @Override
                public void onPrepareLoad(Drawable placeHolderDrawable) {
                }
            };
            subscriber.add(new Subscription() {
                private boolean unSubscribed;

                @Override
                public void unsubscribe() {
                    picasso.cancelRequest(target);
                    unSubscribed = true;
                }

                @Override
                public boolean isUnsubscribed() {
                    return unSubscribed;
                }
            });
            picasso.load(imageUrl).into(target);
        }
    });
}

পিএস সাবস্ক্রাইব করার সময়, আপনার ক্রিয়াকলাপের সাবস্ক্রিপশন রেফারেন্সটি সঞ্চয় করুন, অন্যথায়, আপনি প্রতিক্রিয়া পাওয়ার আগে লক্ষ্যটি জিসি'ড হবে ...


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