অ্যান্ড্রয়েডের তালিকাভিউতে কীভাবে আলস্য লোড চিত্রগুলি


1929

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

মোট চিত্রের সংখ্যা নির্দিষ্ট নয়।


10
আপনি গ্রিনড্রয়েডের অ্যাসিঙ্কআইমেজভিউটি ব্যবহার করতে পারেন । শুধু কল setUrl
পাস্কাল ডিমাসিমো

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

5
এমনকি আপনি এই লাইব্রেরিতে চেষ্টা করে দেখতে পারেন: অ্যান্ড্রয়েড-এইচপি-ইমেজ-ম্যানেজার যা আমার মতে ইমেজগুলি অ্যাসিক্রোনাস লোড করার জন্য সেরা is
itতেশ কুমার দুবে

34
কেবল পিকাসো ব্যবহার করুন, এটি নিজেই করবে। 'পিকাসো.উইথ (আপনার কনটেক্সট) .লোড (ইমগ এসসিআর / পাথ / এখানে আঁকতে সক্ষম) in এটাই!
অনুজ শর্মা

6
ব্যবহার করে দেখুন: github.com/nostra13/Android-Universal- ইমেজ- লুডার , এই লাইব্রেরিটি অলস লোডিং এবং চিত্রের
ক্যাচিংয়ের

উত্তর:


1086

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

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

104
আমি মনে করি আপনার সফ্টরাইফারেন্সগুলি ব্যবহার করা উচিত যাতে আপনার প্রোগ্রামটি কখনই আউটঅফমিউরিএক্সেপশন সৃষ্টি না করে। জিসি যেমন হিপ আকার বাড়ছে তখন সফটরিফারেন্সগুলি সাফ করতে পারে ... আপনি নিজের প্রজন্মকে কয়েক সেকেন্ড পরে সেই তালিকাতে রাখতে পারবেন এবং লোডিংয়ের আগে পরীক্ষা করে দেখতে হবে যে চিত্রটি যদি উপস্থিত থাকে তবে এটি আবার ডাউনলোড করবেন না বরং সংগ্রহ করুন collect এটি সেই তালিকা থেকে এবং এটিকে আপনার সফটরেফ তালিকায় ফিরিয়ে রাখুন এবং কিছু সময়ের পরে আপনি নিজের হার্ডলিস্টটি শুদ্ধ করতে পারেন :)
এজেড_

36
গুগল শেল্ভস প্রকল্পটি হ'ল তারা কীভাবে কোড. google.com/p/shelves করেছেন
এজেড_

12
অঙ্কনযোগ্য ম্যাপে ছবিটি আনার সময় আপনি কী কোনও ফেরত মিস করবেন না ... আনতে-থ্রেড শুরু না করেই?
কারসেল

5
এই কোডটিতে বেশ কয়েকটি সমস্যা রয়েছে। প্রথমত আপনি drawables ক্যাশে উচিত, যে একটি মেমরি লিক কারণ হবে: stackoverflow.com/questions/7648740/... । দ্বিতীয়ত ক্যাশে নিজেই সাফ হয় না তাই এটি চিরদিনের জন্য বর্ধিত হবে, এটিই অন্য স্মৃতি লিক ak
satur9nine


1024

আমি চিত্রগুলি সহ একটি অলস তালিকার একটি সহজ ডেমো তৈরি করেছি (গিটহাবে অবস্থিত)।

বেসিক ব্যবহার

ImageLoader imageLoader=new ImageLoader(context); ...
imageLoader.DisplayImage(url, imageView); 

আপনার AndroidManLive.xML এ নিম্নলিখিত অনুমতিগুলি যুক্ত করতে ভুলবেন না:

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

ইমেজল্ডারের একটি মাত্র উদাহরণ তৈরি করুন এবং আপনার অ্যাপ্লিকেশন জুড়ে এটি পুনরায় ব্যবহার করুন। এইভাবে চিত্রের ক্যাচিং আরও বেশি দক্ষ হবে।

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

বিকল্প পাঠ


7
আপনাকে ধন্যবাদ, আমি আমার প্রকল্পের প্রায় সর্বত্র আপনার কোডের একটি সামান্য পরিবর্তিত সংস্করণ ব্যবহার করছি: Code.google.com/p/vimeoid/source/browse/apk/src/com/fedorvlasov/…
shaman.sir

3
বিকল্প হিসাবে গিলস দেবুনের কোডের দিকে কি কেউ তাকিয়েছে? আমি যে দুটি বড় পার্থক্য দেখছি তা হ'ল 1) মেমরি ক্যাশে বনাম এসডি কার্ড এবং 2) থ্রেড পুলের পরিবর্তে অ্যাসিঙ্কটাস্ক ব্যবহার। android-developers.blogspot.com/2010/07/…
রিচার্ড

4
একটি বাগ রয়েছে, কখনও কখনও তা বরখাস্ত করা হয়: 10-13 09: 58: 46.738: এরর / অ্যান্ড্রয়েড রুনটাইম (24250): অপ্রকাশিত হ্যান্ডলার: অপ্রয়োজনীয় ব্যতিক্রমের কারণে থ্রেডের মূল প্রস্থান 10-10 09: 58: 46.768: এআরআর / অ্যান্ড্রয়েড রুনটাইম (24250) : java.lang.ArrayIndexOutOfBoutsException: অ্যারে সূচিটি সীমার বাইরে নয়: 0 10-13 09: 58: 46.768: ERROR / AndroidRuntime (24250): java.util.Vector.elementAt (ভেক্টর.জাভা ৩৩31) 10-13 09: 58: 46.768: ERROR / AndroidRunটাইম (24250): at java.util.Vector.get (Vector.java:445) 10-13 09: 58: 46.768: ERROR / AndroidRuntime (24250): com.my.app.image এ .আইম্বজলডার $ ফটো কিউইউ.ক্লিয়েন (চিত্রলয়েডার.জাভা:91)
মিকুওস

64
আমি আমার মতো নবাগতদের জন্য যুক্ত করতে চাই যে আপনি যদি এই কোডটি নিজের প্রকল্পে যুক্ত করতে চান তবে আপনাকে অবশ্যই ম্যানিফেস্টে বহিরাগত ক্যাশের অনুমতি যুক্ত করতে হবে। আপনাকে ধন্যবাদ
অ্যাডাম

2
@ ব্রুসহিল সর্বশেষ উত্স কোডে কোনও ফটোকুই নেই। মনে হচ্ছে আপনি খুব পুরানো সংস্করণ ব্যবহার করছেন।
ফেডোর

551

আমি ওপেন সোর্স ইনস্ট্রুমেন্ট ইউনিভার্সাল ইমেজ লোডার প্রস্তাব দিই । এটি মূলত ফেডার ভ্লাসভের প্রকল্প লাজিলিস্টের উপর ভিত্তি করে এবং তখন থেকেই ব্যাপক উন্নতি হয়েছে।

  • মাল্টিথ্রেড চিত্র লোড হচ্ছে
  • বিস্তৃত টিউনিংয়ের সম্ভাব্যতা চিত্রলুডারের কনফিগারেশন (থ্রেড এক্সিকিউটার, ডাউনলডার, ডিকোডার, মেমরি এবং ডিস্ক ক্যাশে, প্রদর্শন চিত্র বিকল্প এবং অন্যান্য)
  • মেমোরিতে এবং / অথবা ডিভাইসের ফাইল সিস্টেমে (বা এসডি কার্ড) চিত্রের ক্যাশে হওয়ার সম্ভাবনা
  • লোডিং প্রক্রিয়া "শোনার" সম্ভাবনা
  • পৃথক বিকল্পগুলির সাথে প্রতিটি প্রদর্শন চিত্র কলটি কাস্টমাইজ করার সম্ভাবনা
  • উইজেট সমর্থন
  • Android 2.0+ সমর্থন 2.0


16
যদি আপনি দুর্দান্ত "চিত্র লোডিং" কোড সন্ধান করেন যা এর স্রষ্টা তার মূল্যবান বাচ্চা হিসাবে আচরণ করে এবং বজায় রাখেন (কেবলমাত্র এক সময়ের সমাধান নয়), আপনি কেবল এটি সন্ধান করেছেন; বড় আপগুলি নস্ট্রা
এন্ড্রয়েডগেকো

সত্যিই দুর্দান্ত কাজ, তবে এটি আমার তালিকার সামান্য কিছুটা পিছিয়ে। আপনি যদি সেরা চিত্র 'ইমেজলডার' বিল্ড বলতে পারতেন ... বা এটি সম্ভবত 'ডিসপ্লেইমেজঅ্যাপশন' বলে because
ডিনিগো

আমি এই গ্রিডভিউটি খুব পছন্দ করি তবে আমি এটি আমার টিউটোরিয়ালের জন্য ব্যবহার করতে পারি না। আমি অ্যান্ড্রয়েডের একটি শিক্ষানবিস। আমি গ্রিডভিউ সম্পর্কে অ্যাপ্লিকেশন তৈরি করি তবে আমার অ্যাপ্লিকেশনটি টার্গেটডডকভিশন 15 ছিল তাই পটভূমির থ্রেডে প্রক্রিয়াটির জন্য আমার অ্যাসিনটাস্ক ব্যবহার করা দরকার। আমি এই গ্রিডভিউটি ব্যবহার করতাম তবে এটি কার্যকর হয় না। আমি কীভাবে এটি টার্গেটএসডিপি ভার্সন 15 এ ব্যবহার করতে পারি?
কোংকেয়া

আপনি ট্যাগের সাথে পৃথক প্রশ্ন তৈরি করতে পারেন [সর্বজনীন-চিত্র-লোডার]
nostra13

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

158

পারফরম্যান্সের জন্য মাল্টিথ্রেডিং , গিলস দেবুনের টিউটোরিয়াল

এটি অ্যান্ড্রয়েড বিকাশকারী ব্লগ থেকে। প্রস্তাবিত কোড ব্যবহার করে:

  • AsyncTasks
  • একটি শক্ত, সীমিত আকার, FIFO cache ,।
  • একটি নরম, সহজে garbage collect -যুক্ত ক্যাশে।
  • আপনি ডাউনলোড করার সময় একটি স্থানধারক Drawable

এখানে চিত্র বর্ণনা লিখুন


10
এটি 2.1 তেও দুর্দান্ত কাজ করে। শুধু AndroidHttpClient ব্যবহার করবেন না।
টমাস আহলে

2
@ থমাস-আহলে আপনাকে ধন্যবাদ, আমি দেখেছি অ্যান্ড্রয়েড এইচটিপিপ্লায়েন্টটি ২.১-এ ত্রুটি দিচ্ছে, এটি ২.২ থেকে বাস্তবায়িত হয়েছে, তবে বাস্তবে এটি প্রতিস্থাপনের জন্য অন্য কিছু খুঁজে পাওয়ার চেষ্টা করা হয়নি।
অ্যাডিনিয়া

4
অ্যাডিনা আপনি ঠিক বলেছেন, আমি ভুলে গেছি তবে রেসিপিটিতে এমন কিছু নেই যা কেবলমাত্র একটি সাধারণ এইচটিপিপ্লেইন্ট দিয়ে করা যায় না।
টমাস আহলে

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

108

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

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

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

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

3
আপনি শক্ত-প্রজন্ম এবং সফট জেনারেশনের মতো প্রজন্ম তৈরি করতে পারেন। আপনি একটি সময় নির্ধারণ করতে পারেন পরিষ্কার ক্যাশে সমস্ত চিত্র মুছে ফেলবে যা 3 সেকেন্ডে অ্যাক্সেস করা হয়নি .. আপনি গুগল তাক প্রকল্পে একবার দেখতে পারেন
এজেড_

বিকাশকারী.অ্যান্ড্রয়েড / রেফারেন্স / জাভা / ল্যাং / রেফ / Soft সফ্টফারফারেন্স ডকটির ক্যাশে সম্পর্কে একটি নোট রয়েছে, "ক্যাশিংয়ের জন্য সফ্ট রেফারেন্স এড়ান" বিভাগ দেখুন। বেশিরভাগ অ্যাপ্লিকেশনগুলিতে নরম রেফারেন্সের পরিবর্তে একটি android.util.LruCache ব্যবহার করা উচিত।
ভোকিলাম

আমি আপনার কোডটির প্রশংসা করি তবে এখন নতুন অ্যান্ড্রয়েড ও / এস-তে 'আগ্রাসী' আবর্জনা সংগ্রহ করা হচ্ছে। দুর্বল রেফারেন্স ধরে রাখা আমার কোনও অর্থ বোধ করে না।
j2emanue

@ j2emanue আপনি ঠিকই বলেছেন, আমি আমার উত্তরের শীর্ষে ইঙ্গিত করার চেষ্টা করেছি, সফ্টফায়ারেন্সগুলি খুব দ্রুত আবর্জনা সংগ্রহ করা হয়। আরও স্পষ্ট করার জন্য আমি এই উত্তরটি সম্পাদনা করার চেষ্টা করব।
টকলিটলে

96

পিকাসো

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

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

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

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

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

অ্যাডাপ্টারে ইমেজভিউ পুনর্ব্যবহার এবং বাতিল বাতিলকরণ পরিচালনা করা। কমপক্ষে মেমরির ব্যবহার সহ জটিল চিত্রের রূপান্তর। স্বয়ংক্রিয় মেমরি এবং ডিস্ক ক্যাশিং।

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

পিছলে পড়া

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

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

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

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

গ্লাইড চিত্র লোডিং লাইব্রেরি

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

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

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

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

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

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


পিকাসো হ'ল স্কয়ার দ্বারা নির্মিত একটি গ্রন্থাগার
লর্ডরেডেনএমকে

82

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

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

দুর্দান্ত কাজ! বিটিডাব্লু ক্লাস নামে একটি টাইপো আছে।
মুলিনস

5
যদি এটি অন্য কারও সময় সাশ্রয় করে: 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;
মাইকেল রিড

অনেক ধন্যবাদ, এটি একটি দুর্দান্ত বাস্তবায়ন। যখন অঙ্কনযোগ্য লোড হচ্ছে তখন এর জন্য আমি একটি পৃথক স্থানধারকও রেখেছি যাতে ব্যবহারকারী কিছু প্রতিক্রিয়া পেতে পারেন।
জুয়ান হার্নান্দেজ

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

9
@ মিশেলআরিড, আপনি যদি একটি গ্রিপ ব্যবহারকারী হন তবে আমি Ctrl-Shift-O ব্যবহার করার পরামর্শ দিচ্ছি (এটি হ'ল অক্ষর নয়, 0 নয়)। এটি আমদানি যুক্ত করার প্রক্রিয়াটি স্বয়ংক্রিয় করে এবং আপনার জন্য এগুলি সংগঠিত করে। আপনি যদি ম্যাকে থাকেন তবে পরিবর্তে কমান্ড-শিফট-ও ব্যবহার করুন।
সিলিথক্রো

78

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


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

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

65

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

গ্রেডল ব্যবহার করুন:

implementation 'com.squareup.picasso:picasso:2.71828'

কোডের এক লাইন!

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

2. গ্লাইড মসৃণ স্ক্রোলিংয়ে ফোকাস করে অ্যান্ড্রয়েডের জন্য একটি চিত্র লোডিং এবং ক্যাচিং লাইব্রেরি

গ্রেডল ব্যবহার করুন:

repositories {
  mavenCentral() 
  google()
}

dependencies {
   implementation 'com.github.bumptech.glide:glide:4.7.1'
   annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'
}

// সাধারণ দর্শনের জন্য:

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

৩. ফ্রেসকো অ্যান্ড্রয়েড অ্যাপ্লিকেশনগুলিতে চিত্র প্রদর্শন করার জন্য একটি শক্তিশালী সিস্টেম F ফ্রেসকো চিত্র লোডিং এবং প্রদর্শনের যত্ন নেয়, যাতে আপনার প্রয়োজন হয় না।

ফ্রেসকো দিয়ে শুরু করা


এই টিউটোরিয়ালটি আপনাকে পিকাসু-র জন্য আরও সাহায্য করতে পারে: - androidtutorialshub.com/… এবং গ্লাইড: - androidtutorialshub.com/…
ললিট ভাসান

52

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

তালিকার টিউটোরিয়ালে চিত্রের অলস লোড


41

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

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


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

আপনি দয়া করে বিস্তারিত বলতে পারেন আমি অ্যান্ড্রয়েড বিকাশে নতুন। যদিও
টিপসটির

14
প্রতিটি চিত্রের জন্য একটি নতুন থ্রেড শুরু করা কার্যকর সমাধান নয়। আপনি মেমরি এবং হিমায়িত ইউআইতে প্রচুর থ্রেড দিয়ে শেষ করতে পারেন।
ফেডার

ফেডার, সম্মত, আমি সাধারণত একটি সারি এবং একটি থ্রেড পুল ব্যবহার করি, এটি ইমো যাওয়ার সেরা উপায়।
jasonhudgins

32

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

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


2
ইমেজডাউনলোডার ক্লাসটি মেনে চলবে না: নীচের সমাধান দেখুন কোড. google.com/p/parleys-android-nextgen/issues/detail?id=1
স্যাম

29

এটি অ্যান্ড্রয়েডে একটি সাধারণ সমস্যা যা বহু লোকের দ্বারা বিভিন্নভাবে সমাধান করা হয়েছে। আমার মতে আমি যে সেরা সমাধানটি দেখেছি তা হ'ল পিকাসো নামক তুলনামূলকভাবে নতুন লাইব্রেরি । এখানে হাইলাইটগুলি রয়েছে:

  • ওপেন সোর্স, কিন্তু দ্বারা আপ নেতৃত্বে Jake Whartonএর ActionBarSherlock খ্যাতি।
  • কোডের এক লাইনের সাথে নেটওয়ার্ক বা অ্যাপ সংস্থানগুলি থেকে অ্যাসিঙ্ক্রোনাসলি চিত্রগুলি লোড করুন
  • স্বয়ংক্রিয় ListView সনাক্তকরণ
  • স্বয়ংক্রিয় ডিস্ক এবং মেমরি ক্যাশিং
  • কাস্টম রূপান্তর করতে পারেন
  • কনফিগারযোগ্য বিকল্পগুলি প্রচুর
  • সুপার সিম্পল এপিআই
  • প্রায়শই আপডেট করা হয়

29

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


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

26

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

এটি আমার কোড:

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

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


আমার কাছে দুর্দান্ত কাজ, তবে আপনার প্রকল্পে অন্তর্ভুক্ত করার জন্য একটি জার ফাইলের দরকার। আপনি যে জারি ফাইলটি এখান থেকে ডাউনলোড করতে পারেন অ্যাকুয়েরি অ্যান্ড্রয়েডএকুয়েরি = নতুন অ্যাকুয়ারি (এটি); লিঙ্কটি হ'ল: কোড. google.com/archive/p/android-query/downloads
সেলিম রাজা

25

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


22

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

ইউনিভার্সাল ইমেজ লোডার

বৈশিষ্ট্য

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

Android 2.0+ সমর্থন 2.0

এখানে চিত্র বর্ণনা লিখুন


20

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

অনুরোধগুলি (এবং বাগের প্রতিবেদনগুলি) স্বাগত জানাই!


16

DroidParts এর ইমেজফ্যাচার রয়েছে যার শুরু করার জন্য শূন্য কনফিগারেশন প্রয়োজন।

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

ক্লোন ড্রয়েড পার্টসগ্রাম উদাহরণ হিসাবে:

এখানে চিত্র বিবরণ লিখুন


হাই, আমি কোড উদাহরণগুলি একবার দেখেছি তবে আমি একটি অ্যারেএডাপ্টারের সাথে ইমেজ ফ্যাচার ব্যবহার করে সমস্যা বোধ করছি, আপনি কি আমার প্রশ্নের দিকে তাকিয়ে কিছু মনে করবেন? stackoverflow.com/questions/21089147/… ধন্যবাদ =]
মাশা

16

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

চারটি মৌলিক উপায় রয়েছে।

  1. ডিআইওয়াই => সেরা সমাধান নয় তবে কয়েকটি চিত্রের জন্য এবং যদি আপনি অন্যের লাইব্রেরি ব্যবহারের ঝামেলা ছাড়াই যেতে চান

  2. ভলির অলস লোডিং লাইব্রেরি => অ্যান্ড্রয়েডের ছেলেরা থেকে। এটি দুর্দান্ত এবং সব কিছু তবে খারাপভাবে নথিভুক্ত রয়েছে এবং তাই এটি ব্যবহারে সমস্যা।

  3. পিকাসো: একটি সহজ সমাধান যা কেবল কাজ করে, আপনি এমনকি সঠিক চিত্রের আকারটি আপনি আনতে চান তা নির্দিষ্ট করে দিতে পারেন use এটি ব্যবহার করা খুব সহজ তবে অ্যাপ্লিকেশনগুলির জন্য খুব বেশি "পারফরম্যান্ট" নাও হতে পারে যা প্রচুর পরিমাণে চিত্রের সাথে মোকাবিলা করতে হয়।

  4. ইউআইএল: অলস লোড চিত্রের সেরা উপায়। আপনি ছবিগুলি ক্যাশে করতে পারেন (অবশ্যই আপনার অনুমতি প্রয়োজন), একবার লোডার আরম্ভ করুন, তারপরে আপনার কাজ শেষ করুন। আমি এখনও অবধি দেখা সবচেয়ে পরিপক্ক অ্যাসিঙ্ক্রোনাস চিত্র লোডিং লাইব্রেরি।


15

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

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


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

13

আমার ল্যাজিলিস্টের কাঁটাচাটি পরীক্ষা করুন । মূলত, আমি ইমেজভিউয়ের কলটি বিলম্ব করে LazyList উন্নতি করেছি এবং দুটি পদ্ধতি তৈরি করেছি:

  1. যখন আপনার "চিত্র লোড হচ্ছে ..." এর মতো কিছু স্থাপন করা দরকার
  2. আপনার যখন ডাউনলোড করা চিত্রটি দেখাতে হবে।

আমি একটি প্রয়োগ করে ImageLoader উন্নত Singleton এই বস্তুর হবে।


12

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

এটি সবকিছুর যত্ন নেয়, আপনার কেবল নিজের পছন্দসই ডিজাইনের কোডটি ঝাঁকুনি ফ্রেমে নেস্টেড পদ্ধতিতে রাখা দরকার। এখানে একটি নমুনা কোড।

<com.facebook.shimmer.ShimmerFrameLayout
     android:id=“@+id/shimmer_view_container”
     android:layout_width=“wrap_content”
     android:layout_height="wrap_content"
     shimmer:duration="1000">

 <here will be your content to display />

</com.facebook.shimmer.ShimmerFrameLayout>

এবং এটির জন্য জাভা কোডটি এখানে।

ShimmerFrameLayout shimmerContainer = (ShimmerFrameLayout) findViewById(R.id.shimmer_view_container);
shimmerContainer.startShimmerAnimation();

আপনার গ্রেড ফাইলটিতে এই নির্ভরতা যুক্ত করুন।

implementation 'com.facebook.shimmer:shimmer:0.1.0@aar'

এটি দেখতে কেমন দেখাচ্ছে।শিমার অ্যান্ড্রয়েড স্ক্রিনশট


11

উপরের সমস্ত কোডের নিজস্ব মূল্য রয়েছে তবে আমার ব্যক্তিগত অভিজ্ঞতার সাথে পিকাসোর সাথে চেষ্টা করুন।

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

: দয়া করে এখানে যান http://code.tutsplus.com/tutorials/android-sdk-working-with-picasso--cms-22149


9

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

ImageView imageView = (ImageView) findViewById(R.id.test_image); 
    GlideDrawableImageViewTarget imagePreview = new GlideDrawableImageViewTarget(imageView);
    Glide
            .with(this)
            .load(url)
            .listener(new RequestListener<String, GlideDrawable>() {
                @Override
                public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {                       
                    return false;
                }

                @Override
                public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
                    return false;
                }
            })
            .into(imagePreview);
}

7

আমি কোনও আলাদা পদ্ধতিতে সুপারিশ করতে পারি যা কমনীয়ের মতো কাজ করে: অ্যান্ড্রয়েড কোয়েরি।

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

AQuery androidAQuery = new AQuery(this);

উদাহরণ হিসাবে:

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

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


7

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



4
public class ImageDownloader {

Map<String, Bitmap> imageCache;

public ImageDownloader() {
    imageCache = new HashMap<String, Bitmap>();

}

// download function
public void download(String url, ImageView imageView) {
    if (cancelPotentialDownload(url, imageView)) {

        // Caching code right here
        String filename = String.valueOf(url.hashCode());
        File f = new File(getCacheDirectory(imageView.getContext()),
                filename);

        // Is the bitmap in our memory cache?
        Bitmap bitmap = null;

        bitmap = (Bitmap) imageCache.get(f.getPath());

        if (bitmap == null) {

            bitmap = BitmapFactory.decodeFile(f.getPath());

            if (bitmap != null) {
                imageCache.put(f.getPath(), bitmap);
            }

        }
        // No? download it
        if (bitmap == null) {
            try {
                BitmapDownloaderTask task = new BitmapDownloaderTask(
                        imageView);
                DownloadedDrawable downloadedDrawable = new DownloadedDrawable(
                        task);
                imageView.setImageDrawable(downloadedDrawable);
                task.execute(url);
            } catch (Exception e) {
                Log.e("Error==>", e.toString());
            }

        } else {
            // Yes? set the image
            imageView.setImageBitmap(bitmap);
        }
    }
}

// cancel a download (internal only)
private static boolean cancelPotentialDownload(String url,
        ImageView imageView) {
    BitmapDownloaderTask bitmapDownloaderTask = getBitmapDownloaderTask(imageView);

    if (bitmapDownloaderTask != null) {
        String bitmapUrl = bitmapDownloaderTask.url;
        if ((bitmapUrl == null) || (!bitmapUrl.equals(url))) {
            bitmapDownloaderTask.cancel(true);
        } else {
            // The same URL is already being downloaded.
            return false;
        }
    }
    return true;
}

// gets an existing download if one exists for the imageview
private static BitmapDownloaderTask getBitmapDownloaderTask(
        ImageView imageView) {
    if (imageView != null) {
        Drawable drawable = imageView.getDrawable();
        if (drawable instanceof DownloadedDrawable) {
            DownloadedDrawable downloadedDrawable = (DownloadedDrawable) drawable;
            return downloadedDrawable.getBitmapDownloaderTask();
        }
    }
    return null;
}

// our caching functions
// Find the dir to save cached images
private static File getCacheDirectory(Context context) {
    String sdState = android.os.Environment.getExternalStorageState();
    File cacheDir;

    if (sdState.equals(android.os.Environment.MEDIA_MOUNTED)) {
        File sdDir = android.os.Environment.getExternalStorageDirectory();

        // TODO : Change your diretcory here
        cacheDir = new File(sdDir, "data/ToDo/images");
    } else
        cacheDir = context.getCacheDir();

    if (!cacheDir.exists())
        cacheDir.mkdirs();
    return cacheDir;
}

private void writeFile(Bitmap bmp, File f) {
    FileOutputStream out = null;

    try {
        out = new FileOutputStream(f);
        bmp.compress(Bitmap.CompressFormat.PNG, 80, out);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (out != null)
                out.close();
        } catch (Exception ex) {
        }
    }
}

// download asynctask
public class BitmapDownloaderTask extends AsyncTask<String, Void, Bitmap> {
    private String url;
    private final WeakReference<ImageView> imageViewReference;

    public BitmapDownloaderTask(ImageView imageView) {
        imageViewReference = new WeakReference<ImageView>(imageView);
    }

    @Override
    // Actual download method, run in the task thread
    protected Bitmap doInBackground(String... params) {
        // params comes from the execute() call: params[0] is the url.
        url = (String) params[0];
        return downloadBitmap(params[0]);
    }

    @Override
    // Once the image is downloaded, associates it to the imageView
    protected void onPostExecute(Bitmap bitmap) {
        if (isCancelled()) {
            bitmap = null;
        }

        if (imageViewReference != null) {
            ImageView imageView = imageViewReference.get();
            BitmapDownloaderTask bitmapDownloaderTask = getBitmapDownloaderTask(imageView);
            // Change bitmap only if this process is still associated with
            // it
            if (this == bitmapDownloaderTask) {
                imageView.setImageBitmap(bitmap);

                // cache the image

                String filename = String.valueOf(url.hashCode());
                File f = new File(
                        getCacheDirectory(imageView.getContext()), filename);

                imageCache.put(f.getPath(), bitmap);

                writeFile(bitmap, f);
            }
        }
    }

}

static class DownloadedDrawable extends ColorDrawable {
    private final WeakReference<BitmapDownloaderTask> bitmapDownloaderTaskReference;

    public DownloadedDrawable(BitmapDownloaderTask bitmapDownloaderTask) {
        super(Color.WHITE);
        bitmapDownloaderTaskReference = new WeakReference<BitmapDownloaderTask>(
                bitmapDownloaderTask);
    }

    public BitmapDownloaderTask getBitmapDownloaderTask() {
        return bitmapDownloaderTaskReference.get();
    }
}

// the actual download code
static Bitmap downloadBitmap(String url) {
    HttpParams params = new BasicHttpParams();
    params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION,
            HttpVersion.HTTP_1_1);
    HttpClient client = new DefaultHttpClient(params);
    final HttpGet getRequest = new HttpGet(url);

    try {
        HttpResponse response = client.execute(getRequest);
        final int statusCode = response.getStatusLine().getStatusCode();
        if (statusCode != HttpStatus.SC_OK) {
            Log.w("ImageDownloader", "Error " + statusCode
                    + " while retrieving bitmap from " + url);
            return null;
        }

        final HttpEntity entity = response.getEntity();
        if (entity != null) {
            InputStream inputStream = null;
            try {
                inputStream = entity.getContent();
                final Bitmap bitmap = BitmapFactory
                        .decodeStream(inputStream);
                return bitmap;
            } finally {
                if (inputStream != null) {
                    inputStream.close();
                }
                entity.consumeContent();
            }
        }
    } catch (Exception e) {
        // Could provide a more explicit error message for IOException or
        // IllegalStateException
        getRequest.abort();
        Log.w("ImageDownloader", "Error while retrieving bitmap from "
                + url + e.toString());
    } finally {
        if (client != null) {
            // client.close();
        }
    }
    return null;
 }
}

4

আমি এই সমস্যাটি পেয়েছি এবং lruCache প্রয়োগ করেছি। আমি বিশ্বাস করি আপনার 12 এবং তদুর্ধের এপিআই দরকার বা তুলনামূলক v4 লাইব্রেরিটি ব্যবহার করুন। lurCache দ্রুত মেমরি, তবে এটির একটি বাজেটও রয়েছে, তাই আপনি যদি ডিস্ক ক্যাশে ব্যবহার করতে পারেন সে সম্পর্কে উদ্বিগ্ন হন ... তবে এটি সমস্ত কিছু ক্যাচিং বিটম্যাপে বর্ণিত হয়েছে It's

আমি এখন আমার বাস্তবায়নটি সরবরাহ করব যা আমি যে কোনও জায়গা থেকে এখানে কল করে সিঙ্গেলটন :

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

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

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

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