برای lazy load کردن تصاویر در listview روش های متفاوتی وجود دارد، در ادامه به آموزش دو روش آن می‌پردازیم.

روش اول

این کد برای نگه داشتن تصاویری که برنامه در حال نمایش است نوشته شده است. توجه داشته باشید که شیء "Log" مورد استفاده در اینجا custom wrapper در کلاس Log نهایی در اندروید است.

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

روش دوم:

LazyList چیست؟

LazyList یک کتابخانه ساده برای نمایش تصاویر در Android ListView است.

نحوه استفاده:

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

فراموش نکنید که مجوزهای زیر را به AndroidManifest.xml خود اضافه کنید:

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

 

تنها یک نمونه از ImageLoader ایجاد کنید و از آن در سراسر برنامه خود استفاده کنید. به این ترتیب کش کردن تصاویر بسیار کارآمدتر خواهد بود.

نحوه عملکرد این روش:

در این روش تصاویر در thread پس زمینه دانلود می‌شود. تصاویر روی کارت SD و در حافظه کش ذخیره می شوند. اجرای کش بسیار ساده است و فقط برای نسخه ی demo کافی است. من تصاویر را با inSampleSize رمزگشایی می کنم تا استفاده از memory را کاهش دهم.

آموزش تبدیل کدهای کاتلین به جاوا در اندروید استودیو

آموزش نحوه Lazy Load تصاویر در ListView اندروید

آموزش نحوه انتقال داده ها بین Activities در برنامه اندروید؟

آموزش به ویبره درآوردن گوشی با برنامه نویسی اندروید

stack trace چیست و چگونه با استفاده از آن اپلیکیشن خود را دیباگ کنیم؟

آموزش نحوه رفع ارور Unfortunately MyApp has stopped در اندروید

drawable ,} ,{ ,urlstring ,the ,license ,the license ,this getclass ,getclass getsimplename ,} } ,drawable drawable ,this getclass getsimplename ,getsimplename fetchdrawable failed ,getclass getsimplename fetchdrawable ,drawablemap containskey urlstring

مشخصات

آخرین ارسال ها

آخرین جستجو ها


دلاوران ایران زمین خريد كيف پول تبلت زنانه دخترانه دانشجویی اداری مردانه 2019 اخبار تکنولوژی و یادگیری کامپیوتر کلیک شبستر آسیاروید | asiaroid تست انواع اپلیکیشن ، سایت و گیم Raguel's game روزانه آقا برقی مطالب اینترنتی
دزدگ